
class Stdio(Object) from 'stdio'
{
	var(#class) in, out, err.

	method(#primitive) open(name, mode).
	method(#primitive) close.
	method(#primitive) gets.
	method(#primitive,#variadic) puts().
	method(#primitive,#variadic) putc().

	method(#class) open: name for: mode
	{
		^(self new) open(name, mode)
	}
	
(* ---------------------
	method(#class) stdin
	{
		self.in isNil ifTrue: [ self.in := ^(super new) open: 0 for: 'r' ].
		^self.in.
	}

	method(#class) stdout
	{
		self.out isNil ifTrue: [ self.out := ^(super new) open: 1 for: 'w' ].
		^self.out.
	}

	method(#class) stderr
	{
		self.err isNil ifTrue: [ self.err := ^(super new) open: 2 for: 'w' ].
		^self.err.
	}
------------------------ *)

	(*
	method format: fmt with: ...
	{
 
	}
	*)

	method(#variadic) format (fmt)
	{
		| a b c |
		'THIS IS FORMAT' dump.
		fmt dump.
		
		thisContext temporaryCount dump.
		0 priorTo: (thisContext vargCount) do: [:k |
			(thisContext vargAt: k) dump.
		].
	}
}

extend Stdio
{
	method xxxx
	{
		self basicSize dump.
	}
}

class Stdio2(Stdio)
{
	method(#class) new
	{
		##self prohibited
		##raise exception. prohibited...
		^(super new).
	}
}
