1:- module(aop_inspection,[
    2
    3  enable_aspect/1,
    4  disable_aspect/1,
    5
    6  enable_extension/3,
    7  disable_extension/3,
    8
    9  current_enabled_aspect/1,
   10  current_enabled_aspect/2,
   11  current_disabled_aspect/1,
   12  current_aspect/1,
   13  current_object/1,
   14  current_method/1
   15  ]).   16
   17% 
   18% Essential definitions for objects,  actions, methods, events
   19% 
   20
   21% aspect(Name)
   22:- dynamic(aop:aspect/1).   23:- multifile(aop:aspect/1).   24
   25% aspect_module(Name,Module)
   26:- dynamic(aop:aspect_module/2).   27:- multifile(aop:aspect_module/2).   28
   29:- dynamic(aop:aspect_enabled/2).   30:- multifile(aop:aspect_enabled/2).   31
   32% object(Aspect,Object,Module) -- used to record objects
   33:- dynamic(aop:object/3).   34:- multifile(aop:object/3).   35
   36% augmented(Aspect,Object,Module) -- used to record augmentation to objects
   37:- dynamic(aop:augmented/3).   38:- multifile(aop:augmented/3).   39
   40% method(Aspect, Object, Message)
   41:- dynamic(aop:method/3).   42:- discontiguous(aop:method/3).   43:- multifile(aop:method/3).   44
   45% method_signature(Aspect, Object, Name/MethodArity, Signature, VariableNames)
   46:- dynamic(aop:method_signature/5).   47:- discontiguous(aop:method_signature/5).   48:- multifile(aop:method_signature/5).   49
   50% extended(Aspect, Object, Name/MethodArity)
   51:- dynamic(aop:extension/3).   52:- discontiguous(aop:extension/3).   53:- multifile(aop:extension/3).   54
   55% Enable extensions (e.g., events and actions)
   56enable_extension(Aspect, Object, Name/Arity) :-
   57  aop:extension(Aspect, Object, Name/Arity)
   58  -> true
   59  ; assertz(aop:extension(Aspect, Object, Name/Arity)).
   60
   61% Disable extensions (e.g., events and actions)
   62disable_extension(Aspect, Object, Name/Arity) :-
   63  retractall(aop:extension(Aspect, Object, Name/Arity)).
   64
   65% 
   66% Toggle aspect status -- disabled aspects do not execute
   67% 
   68enable_aspect(Aspect) :-
   69    retractall(aop:aspect_enabled(Aspect,_)),
   70    assertz(aop:aspect_enabled(Aspect, true)).
   71
   72disable_aspect(Aspect) :-
   73    retractall(aop:aspect_enabled(Aspect,_)),
   74    assertz(aop:aspect_enabled(Aspect, false)).
   75
   76% 
   77% Enumerators
   78% 
   79current_enabled_aspect(Aspect) :-
   80  current_aspect(Aspect),
   81  aop:aspect_enabled(Aspect,true).
   82
   83current_enabled_aspect(Aspect, Module) :-
   84  current_enabled_aspect(Aspect),
   85  aop:aspect_module(Aspect, Module),
   86  aop:aspect_enabled(Aspect,true).
   87
   88current_disabled_aspect(Aspect) :-
   89  current_aspect(Aspect),
   90  aop:aspect_enabled(Aspect,false).
   91
   92current_aspect(Aspect) :-
   93  aop:aspect(Aspect).
   94
   95current_object(Def) :-
   96  aop:object(Aspect, Object, Module),
   97  Def = aop:object(Aspect, Object, Module).
   98
   99current_method(Def) :-
  100  aop:method(Aspect, Object, Message),
  101  Def = aop:method(Aspect, Object, Message)