summaryrefslogtreecommitdiff
path: root/bos-sugar.sh
diff options
context:
space:
mode:
Diffstat (limited to 'bos-sugar.sh')
-rw-r--r--bos-sugar.sh41
1 files changed, 23 insertions, 18 deletions
diff --git a/bos-sugar.sh b/bos-sugar.sh
index 8f3a810..152f5d8 100644
--- a/bos-sugar.sh
+++ b/bos-sugar.sh
@@ -31,31 +31,34 @@ function bos-sugar/declare-block() {
# ----
-function bos-sugar/set-metaclass-for() {
- local class="$1"
- local metaclass_ref; bos-namespaces/store-scalar-for-into metaclass_ref meta "$class"
- local -n metaclass_object="$metaclass_ref"
- metaclass_object='bos-dispatch/invoke bos/meta/class 0'
+function bos-sugar/declare-helpers() {
+ function extends() {
+ local fq_class; bos-namespaces/current-namespace-into fq_class
+ local metaclass_instance; bos-meta/metaclass-instance-for-class-into metaclass_instance "$fq_class"
+ $metaclass_instance set-superclasses-for "$fq_class" "$@"
+ }
+}
+
+function bos-sugar/remove-helpers() {
+ unset extends
}
function bos-sugar/class-open() {
- if [[ "${#*}" -ne 1 ]]; then
- >&2 echo "'class \$class_name; do …; done', not 'class $*'"
+ if [[ "${#*}" -lt 1 || "${#*}" -gt 2 ]]; then
+ >&2 echo "'class \$class_name [\$metaclass]; do …; done', not 'class $*'"
return 1
fi
+ local class="$1"
+ local metaclass="${2:-bos/meta/class}"
- function extends() {
- local fq_class; bos-namespaces/current-namespace-into fq_class
- local metaclass_ref; bos-namespaces/store-scalar-for-into metaclass_ref meta "$fq_class"
- local -n metaclass_object="$metaclass_ref"
- $metaclass_object set-superclasses-for "$fq_class" "$@"
- }
+ bos-sugar/declare-helpers
- local class="$1"
bos-namespaces/namespace-open "$1"
local fq_class; bos-namespaces/current-namespace-into fq_class
- bos-sugar/set-metaclass-for "$fq_class"
+ local class_open_metaclass_instance; $metaclass new-into class_open_metaclass_instance
+
+ bos-meta/set-metaclass-instance-for "$fq_class" "$class_open_metaclass_instance"
return 0
}
@@ -64,16 +67,18 @@ function bos-sugar/class-close() {
local class="$1";
local fq_class; bos-namespaces/current-namespace-into fq_class
- local metaclass_ref; bos-namespaces/store-scalar-for-into metaclass_ref meta "$fq_class"
- local -n metaclass_object="$metaclass_ref"
bos-namespaces/namespace-close
- $metaclass_object make-mro-for "$fq_class"
+ local class_close_metaclass_instance; bos-meta/metaclass-instance-for-class-into class_close_metaclass_instance "$fq_class"
+
+ $class_close_metaclass_instance make-mro-for "$fq_class"
# TODO this should probably be done by the metaclass?
eval "function $fq_class { bos-dispatch/invoke \"$fq_class\" 0 \"\$@\"; }"
+ bos-sugar/remove-helpers
+
return 0
}