package org.perl6.metamodel;
import java.util.*;
public class Class {
private MetaClass META;
private String name;
public Class(String _name, HashMap _options) {
this.META = new MetaClass("_");
this.extract_name(_name);
this.process_options(_options);
}
public MetaClass meta () {
return this.META;
}
public boolean isa (String class_name) {
return this.meta().is_a(class_name);
}
public Method can (String method_name) {
HashMap opts = new HashMap();
opts.put("for", "CLASS");
try {
return MetaModel.WALKMETH(this.meta().dispatcher(":canonical"),
method_name,
opts);
} catch (Exception e) {
return null;
}
}
private void extract_name(String long_name) {
String[] short_name = long_name.split("-");
try {
this.name = short_name[0];
this.meta().name(short_name[0]);
this.meta().version(short_name[1]);
this.meta().authority(short_name[2]);
}
catch (ArrayIndexOutOfBoundsException e) {}
}
private void process_options (HashMap options) {
try {
if (options.containsKey("is")) {
ArrayList is = (ArrayList) options.get("is");
ArrayList supers = new ArrayList();
for (int i = 0; i < is.size(); i++) {
supers.add( ( (Class)is.get(i) ).meta() );
}
this.meta().superclasses(supers);
}
if (options.containsKey("does")) {
//ArrayList does = (ArrayList) options.get("does");
}
if (options.containsKey("instance")) {
HashMap instance = (HashMap)options.get("instance");
if (instance.containsKey("methods"))
store_methods((HashMap)instance.get("methods"), "INSTANCE");
if (instance.containsKey("attrs"))
store_attrs((ArrayList)instance.get("attrs"), "INSTANCE");
}
if (options.containsKey("class")) {
HashMap _class = (HashMap)options.get("class");
if (_class.containsKey("methods"))
store_methods((HashMap)_class.get("methods"), "CLASS");
if (_class.containsKey("attrs"))
store_attrs((ArrayList)_class.get("attrs"), "CLASS");
}
} catch (Exception e) {
System.out.println(e);
}
}
private void store_methods(HashMap methods, String which_table) throws Exception {
Set keys = methods.keySet();
Iterator iter = keys.iterator();
while (iter.hasNext()) {
String label = (String)iter.next();
Method method = (Method)methods.get(label);
this.meta().add_method(label, method, which_table);
}
}
private void store_attrs(ArrayList attrs, String which_table) throws Exception {
Iterator iter = attrs.iterator();
String name = "";
HashMap props = new HashMap();
while (iter.hasNext()) {
java.lang.Object attr = iter.next();
if ( attr.getClass().getName().equals("java.util.ArrayList") ) {
name = (String) ((ArrayList)attr).get(0);
props = (HashMap) ((ArrayList)attr).get(1);
}
else {
name = (String)attr;
}
Attribute attribute = new Attribute(this.meta(), name, props);
this.meta().add_attribute(name, attribute, which_table);
}
}
}