git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@53 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
		
			
				
	
	
		
			118 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| :- object(class,
 | |
| 	implements(classp),
 | |
| 	instantiates(class),
 | |
| 	specializes(abstract_class)).
 | |
| 
 | |
| 
 | |
| 	:- info([
 | |
| 		version is 1.0,
 | |
| 		authors is 'Paulo Moura',
 | |
| 		date is 2000/7/24,
 | |
| 		comment is 'Default metaclass for all classes.']).
 | |
| 
 | |
| 
 | |
| 	:- private(instance_counter_/1).
 | |
| 	:- dynamic(instance_counter_/1).
 | |
| 
 | |
| 	:- mode(instance_counter_(?integer), zero_or_one).
 | |
| 
 | |
| 	:- info(instance_counter_/1, [
 | |
| 		comment is 'Stores a counter of created instances.',
 | |
| 		argnames is ['Counter']]).
 | |
| 
 | |
| 
 | |
| 	new(Object) :-
 | |
| 		::new(Object, []).
 | |
| 
 | |
| 
 | |
| 	new(Object, Options) :-
 | |
| 		valid_new_identifier(Object),
 | |
| 		self(Self),
 | |
| 		create_object(Object, [instantiates(Self)], [], []),
 | |
| 		Object::init(Options).
 | |
| 
 | |
| 
 | |
| 	clone(Object, Clone) :-
 | |
| 		self(Self),
 | |
| 		sender(Sender),
 | |
| 		throw(error(subclass_responsability, Self::clone(Object, Clone), Sender)).
 | |
| 
 | |
| 
 | |
| 	delete(Object) :-
 | |
| 		::delete(Object, []).
 | |
| 
 | |
| 
 | |
| 	delete(Object, Options) :-
 | |
| 		::instance(Object),
 | |
| 		Object::free(Options),
 | |
| 		abolish_object(Object).
 | |
| 
 | |
| 
 | |
| 	delete_all :-
 | |
| 		::delete_all([]).
 | |
| 
 | |
| 
 | |
| 	delete_all(Options) :-
 | |
| 		::instance(Instance),
 | |
| 		object_property(Instance, (dynamic)),
 | |
| 		::delete(Instance, Options),
 | |
| 		fail.
 | |
| 
 | |
| 	delete_all(_) :-
 | |
| 		\+ (::instance(Instance),
 | |
| 			object_property(Instance, (dynamic))).
 | |
| 
 | |
| 
 | |
| 	instance_base_name(i).
 | |
| 
 | |
| 
 | |
| 	instance_counter_(0).
 | |
| 
 | |
| 
 | |
| 	valid_new_identifier(Identifier) :-
 | |
| 		var(Identifier), !,
 | |
| 		retract(instance_counter_(Last)),
 | |
| 		::instance_base_name(Base),
 | |
| 		functor(Base, Functor, Arity),
 | |
| 		number_codes(Arity, Codes),
 | |
| 		atom_codes(Atom, Codes),
 | |
| 		repeat,
 | |
| 			next_integer(Last, Next),
 | |
| 			number_codes(Next, Codes2),
 | |
| 			atom_codes(Atom2, Codes2),
 | |
| 			atom_concat(Functor, Atom2, Identifier),
 | |
| 			atom_concat(Identifier, Atom, Prefix),
 | |
| 			\+ current_predicate(Prefix/_),
 | |
| 			asserta(instance_counter_(Next)),
 | |
| 		!.
 | |
| 
 | |
| 	valid_new_identifier(Identifier) :-
 | |
| 		once((atom(Identifier); compound(Identifier))),
 | |
| 		functor(Identifier, Functor, Arity),
 | |
| 		number_codes(Arity, Codes),
 | |
| 		atom_codes(Atom, Codes),
 | |
| 		atom_concat(Functor, Atom, Prefix),
 | |
| 		\+ current_predicate(Prefix/_).
 | |
| 
 | |
| 
 | |
| 	next_integer(N, N1) :-
 | |
| 		N1 is N + 1.
 | |
| 
 | |
| 	next_integer(N, N2) :-
 | |
| 		N1 is N + 1,
 | |
| 		next_integer(N1, N2).
 | |
| 
 | |
| 
 | |
| 	equals(Instance1, Instance2) :-
 | |
| 		self(Self),
 | |
| 		sender(Sender),
 | |
| 		throw(error(subclass_responsability, Self::equals(Instance1, Instance2), Sender)).
 | |
| 
 | |
| 
 | |
| 	abstract_class :-
 | |
| 		fail.
 | |
| 
 | |
| 
 | |
| :- end_object.
 |