#include 'Stix.st'.

#################################################################
## MAIN
#################################################################

## TODO: use #define to define a class or use #class to define a class.
##       use #extend to extend a class
##       using #class for both feels confusing.

#extend Apex
{

}

#extend SmallInteger
{
	#method getTrue: anInteger
	{
		^anInteger + 9999.
	}

	#method inc
	{
		^self + 1.
	}
}

#class TestObject(Object)
{
	#dcl(#class) Q R.
	#dcl(#classinst) t1 t2.
}


#class MyObject(TestObject)
{
	#dcl(#class) C B A.

	#method getTrue
	{
		^true.
	}

	#method getTrue: anInteger
	{
		^ anInteger
	}
	#method getFalse
	{
		^false
	}

	#method a { ^ 10 }
	#method b { ^ 20 }
	#method c { ^ 30 }

	#method(#class) a: a b: b c: c
	{
		^ a + b + c.
	}

	#method(#class) getBlock
	{
		| a |
		a := 7777777.
"
		^[1 + [^a]].
		1234567 dump.
"

		^[self a: a b: 3 c: ([[[^6] value] value ] value)].
	}

	#method(#class) main
	{
"
		| k | 

		k := 30.
		k := k + 10; + 20.
		k dump.
		(self a: 1 b: 2 c: 3) dump.
		[self a: 1 b: 2 c: 3] value dump.
		[self a: 1 b: 2 c: 3] value dump.
		[self a: 9 b: 10 c: 11] value dump.


		((k = 2) ifTrue: [11111] ifFalse: [2222])dump.

		self getBlock value dump.

		[10 + [^20]] value dump.
"


		'START OF MAIN' dump.
		[2 + 3 + 1 + [[[^6] value] value ] value] value dump.
	##	^(self a: (self new a) b: ([:a :b | a + b] value: 10 value: 20) c: (self new c)) dump.
		##self getBlock value dump.
		'END OF MAIN' dump.
	}

}