├── .gitignore ├── Makefile.PL ├── README.md ├── cpanfile ├── lib ├── Moxie.pm ├── mop.pm └── mop │ ├── attribute.pm │ ├── class.pm │ ├── instance.pm │ ├── internal │ ├── util.pm │ └── util │ │ └── syntax.pm │ ├── method.pm │ ├── object.pm │ └── role.pm ├── mop.xs ├── parameterized-roles.md ├── ppport.h ├── src ├── c │ ├── p5mop.c │ ├── p5mop.h │ ├── p5mop_MaV.c │ ├── p5mop_MaV.h │ ├── p5mop_MmV.c │ ├── p5mop_MmV.h │ ├── p5mop_MpV.c │ ├── p5mop_MpV.h │ ├── p5mop_OV.c │ ├── p5mop_OV.h │ ├── p5mop_internal.c │ └── p5mop_internal.h └── xs │ └── mop │ ├── attribute.xs │ ├── class.xs │ ├── internal.xs │ ├── method.xs │ └── role.xs └── t ├── 000-load.t ├── 000-samples ├── 001-point.t ├── 002-bank-account.t ├── 003-binary-tree.t ├── 004-linked-list.t ├── 005-throwable.t ├── 006-logger.t ├── 007-currency.t ├── 008-cache.t └── 009-counter.t ├── 001-basic ├── 001-basic.t ├── 001-new.t ├── 002-new-w-attributes.t ├── 003-BUILD.t ├── 004-DEMOLISH.t ├── 005-attribute-override.t ├── 006-next-method.t ├── 007-class-methods.t ├── 017-method-closures.t ├── 020-simple-attributes.t ├── 021-attributes-w-detaults.t ├── 022-attributes-w-lazy-defaults.t ├── 023-attributes-w-lazy-accessor.t ├── 024-attributes-w-complex-defaults.t ├── 025-attributes-w-lazy-complex-default.t ├── 026-complex-attributes.t ├── 027-multi-complex-attributes.t ├── 028-attributes-in-class-methods.t ├── 030-abstract-classes.t ├── 031-abitrary-abstract-classes.t └── 041-required.t ├── 010-class ├── 001-basic.t ├── 002-basic-w-finalization.t ├── 010-with-roles.t ├── 020-with-attributes.t └── 021-gather-attributes-at-UNITCHECK.t ├── 020-object └── 001-basic.t ├── 030-roles ├── 001-basic.t ├── 002-compose-into-role.t ├── 003-multiple-role-compose.t ├── 004-DOES.t ├── 007-next-method.t ├── 008-multilevel-does.t ├── 010-role-to-abstract-class.t ├── 020-attribute-conflict.t ├── 021-deep-attribute-conflict.t ├── 022-deep-method-conflict.t ├── 025-method-conflict.t ├── 026-multiple-method-conflict.t ├── 050-with-requires.t └── 060-inherited-methods-fulfill-requirements.t ├── 040-method └── 001-basic.t ├── 060-opaque └── 001-basic.t └── 100-core ├── 010-class.t ├── 020-role.t ├── 030-method.t └── 040-attribute.t /.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/.gitignore -------------------------------------------------------------------------------- /Makefile.PL: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/Makefile.PL -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## *{$Yet . "::" . $Another} = \\&Mop::Prototype; 2 | -------------------------------------------------------------------------------- /cpanfile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/cpanfile -------------------------------------------------------------------------------- /lib/Moxie.pm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/lib/Moxie.pm -------------------------------------------------------------------------------- /lib/mop.pm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/lib/mop.pm -------------------------------------------------------------------------------- /lib/mop/attribute.pm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/lib/mop/attribute.pm -------------------------------------------------------------------------------- /lib/mop/class.pm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/lib/mop/class.pm -------------------------------------------------------------------------------- /lib/mop/instance.pm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/lib/mop/instance.pm -------------------------------------------------------------------------------- /lib/mop/internal/util.pm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/lib/mop/internal/util.pm -------------------------------------------------------------------------------- /lib/mop/internal/util/syntax.pm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/lib/mop/internal/util/syntax.pm -------------------------------------------------------------------------------- /lib/mop/method.pm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/lib/mop/method.pm -------------------------------------------------------------------------------- /lib/mop/object.pm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/lib/mop/object.pm -------------------------------------------------------------------------------- /lib/mop/role.pm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/lib/mop/role.pm -------------------------------------------------------------------------------- /mop.xs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/mop.xs -------------------------------------------------------------------------------- /parameterized-roles.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/parameterized-roles.md -------------------------------------------------------------------------------- /ppport.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/ppport.h -------------------------------------------------------------------------------- /src/c/p5mop.c: -------------------------------------------------------------------------------- 1 | #include "p5mop.h" -------------------------------------------------------------------------------- /src/c/p5mop.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/c/p5mop.h -------------------------------------------------------------------------------- /src/c/p5mop_MaV.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/c/p5mop_MaV.c -------------------------------------------------------------------------------- /src/c/p5mop_MaV.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/c/p5mop_MaV.h -------------------------------------------------------------------------------- /src/c/p5mop_MmV.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/c/p5mop_MmV.c -------------------------------------------------------------------------------- /src/c/p5mop_MmV.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/c/p5mop_MmV.h -------------------------------------------------------------------------------- /src/c/p5mop_MpV.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/c/p5mop_MpV.c -------------------------------------------------------------------------------- /src/c/p5mop_MpV.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/c/p5mop_MpV.h -------------------------------------------------------------------------------- /src/c/p5mop_OV.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/c/p5mop_OV.c -------------------------------------------------------------------------------- /src/c/p5mop_OV.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/c/p5mop_OV.h -------------------------------------------------------------------------------- /src/c/p5mop_internal.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/c/p5mop_internal.c -------------------------------------------------------------------------------- /src/c/p5mop_internal.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/c/p5mop_internal.h -------------------------------------------------------------------------------- /src/xs/mop/attribute.xs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/xs/mop/attribute.xs -------------------------------------------------------------------------------- /src/xs/mop/class.xs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/xs/mop/class.xs -------------------------------------------------------------------------------- /src/xs/mop/internal.xs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/xs/mop/internal.xs -------------------------------------------------------------------------------- /src/xs/mop/method.xs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/xs/mop/method.xs -------------------------------------------------------------------------------- /src/xs/mop/role.xs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/src/xs/mop/role.xs -------------------------------------------------------------------------------- /t/000-load.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/000-load.t -------------------------------------------------------------------------------- /t/000-samples/001-point.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/000-samples/001-point.t -------------------------------------------------------------------------------- /t/000-samples/002-bank-account.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/000-samples/002-bank-account.t -------------------------------------------------------------------------------- /t/000-samples/003-binary-tree.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/000-samples/003-binary-tree.t -------------------------------------------------------------------------------- /t/000-samples/004-linked-list.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/000-samples/004-linked-list.t -------------------------------------------------------------------------------- /t/000-samples/005-throwable.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/000-samples/005-throwable.t -------------------------------------------------------------------------------- /t/000-samples/006-logger.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/000-samples/006-logger.t -------------------------------------------------------------------------------- /t/000-samples/007-currency.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/000-samples/007-currency.t -------------------------------------------------------------------------------- /t/000-samples/008-cache.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/000-samples/008-cache.t -------------------------------------------------------------------------------- /t/000-samples/009-counter.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/000-samples/009-counter.t -------------------------------------------------------------------------------- /t/001-basic/001-basic.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/001-basic.t -------------------------------------------------------------------------------- /t/001-basic/001-new.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/001-new.t -------------------------------------------------------------------------------- /t/001-basic/002-new-w-attributes.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/002-new-w-attributes.t -------------------------------------------------------------------------------- /t/001-basic/003-BUILD.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/003-BUILD.t -------------------------------------------------------------------------------- /t/001-basic/004-DEMOLISH.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/004-DEMOLISH.t -------------------------------------------------------------------------------- /t/001-basic/005-attribute-override.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/005-attribute-override.t -------------------------------------------------------------------------------- /t/001-basic/006-next-method.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/006-next-method.t -------------------------------------------------------------------------------- /t/001-basic/007-class-methods.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/007-class-methods.t -------------------------------------------------------------------------------- /t/001-basic/017-method-closures.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/017-method-closures.t -------------------------------------------------------------------------------- /t/001-basic/020-simple-attributes.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/020-simple-attributes.t -------------------------------------------------------------------------------- /t/001-basic/021-attributes-w-detaults.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/021-attributes-w-detaults.t -------------------------------------------------------------------------------- /t/001-basic/022-attributes-w-lazy-defaults.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/022-attributes-w-lazy-defaults.t -------------------------------------------------------------------------------- /t/001-basic/023-attributes-w-lazy-accessor.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/023-attributes-w-lazy-accessor.t -------------------------------------------------------------------------------- /t/001-basic/024-attributes-w-complex-defaults.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/024-attributes-w-complex-defaults.t -------------------------------------------------------------------------------- /t/001-basic/025-attributes-w-lazy-complex-default.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/025-attributes-w-lazy-complex-default.t -------------------------------------------------------------------------------- /t/001-basic/026-complex-attributes.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/026-complex-attributes.t -------------------------------------------------------------------------------- /t/001-basic/027-multi-complex-attributes.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/027-multi-complex-attributes.t -------------------------------------------------------------------------------- /t/001-basic/028-attributes-in-class-methods.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/028-attributes-in-class-methods.t -------------------------------------------------------------------------------- /t/001-basic/030-abstract-classes.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/030-abstract-classes.t -------------------------------------------------------------------------------- /t/001-basic/031-abitrary-abstract-classes.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/031-abitrary-abstract-classes.t -------------------------------------------------------------------------------- /t/001-basic/041-required.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/001-basic/041-required.t -------------------------------------------------------------------------------- /t/010-class/001-basic.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/010-class/001-basic.t -------------------------------------------------------------------------------- /t/010-class/002-basic-w-finalization.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/010-class/002-basic-w-finalization.t -------------------------------------------------------------------------------- /t/010-class/010-with-roles.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/010-class/010-with-roles.t -------------------------------------------------------------------------------- /t/010-class/020-with-attributes.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/010-class/020-with-attributes.t -------------------------------------------------------------------------------- /t/010-class/021-gather-attributes-at-UNITCHECK.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/010-class/021-gather-attributes-at-UNITCHECK.t -------------------------------------------------------------------------------- /t/020-object/001-basic.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/020-object/001-basic.t -------------------------------------------------------------------------------- /t/030-roles/001-basic.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/001-basic.t -------------------------------------------------------------------------------- /t/030-roles/002-compose-into-role.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/002-compose-into-role.t -------------------------------------------------------------------------------- /t/030-roles/003-multiple-role-compose.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/003-multiple-role-compose.t -------------------------------------------------------------------------------- /t/030-roles/004-DOES.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/004-DOES.t -------------------------------------------------------------------------------- /t/030-roles/007-next-method.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/007-next-method.t -------------------------------------------------------------------------------- /t/030-roles/008-multilevel-does.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/008-multilevel-does.t -------------------------------------------------------------------------------- /t/030-roles/010-role-to-abstract-class.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/010-role-to-abstract-class.t -------------------------------------------------------------------------------- /t/030-roles/020-attribute-conflict.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/020-attribute-conflict.t -------------------------------------------------------------------------------- /t/030-roles/021-deep-attribute-conflict.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/021-deep-attribute-conflict.t -------------------------------------------------------------------------------- /t/030-roles/022-deep-method-conflict.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/022-deep-method-conflict.t -------------------------------------------------------------------------------- /t/030-roles/025-method-conflict.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/025-method-conflict.t -------------------------------------------------------------------------------- /t/030-roles/026-multiple-method-conflict.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/026-multiple-method-conflict.t -------------------------------------------------------------------------------- /t/030-roles/050-with-requires.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/050-with-requires.t -------------------------------------------------------------------------------- /t/030-roles/060-inherited-methods-fulfill-requirements.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/030-roles/060-inherited-methods-fulfill-requirements.t -------------------------------------------------------------------------------- /t/040-method/001-basic.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/040-method/001-basic.t -------------------------------------------------------------------------------- /t/060-opaque/001-basic.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/060-opaque/001-basic.t -------------------------------------------------------------------------------- /t/100-core/010-class.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/100-core/010-class.t -------------------------------------------------------------------------------- /t/100-core/020-role.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/100-core/020-role.t -------------------------------------------------------------------------------- /t/100-core/030-method.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/100-core/030-method.t -------------------------------------------------------------------------------- /t/100-core/040-attribute.t: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevan/p5-mop-again-seriously-wtf/HEAD/t/100-core/040-attribute.t --------------------------------------------------------------------------------