Added facility to checkout packages default tip
authorJan Vrany <jan.vrany@fit.cvut.cz>
Thu, 21 Aug 2014 09:19:39 +0100
changeset 29 b119000cd096
parent 28 7a19c680f37e
Added facility to checkout packages
stx/goodies/metacello/Make.proto
stx/goodies/metacello/Make.spec
stx/goodies/metacello/Makefile.init
stx/goodies/metacello/abbrev.stc
stx/goodies/metacello/base/BaselineOf.st
stx/goodies/metacello/base/ConfigurationOf.st
stx/goodies/metacello/base/Make.proto
stx/goodies/metacello/base/Make.spec
stx/goodies/metacello/base/Makefile.init
stx/goodies/metacello/base/Metacello.st
stx/goodies/metacello/base/abbrev.stc
stx/goodies/metacello/base/base.rc
stx/goodies/metacello/base/bc.mak
stx/goodies/metacello/base/bmake.bat
stx/goodies/metacello/base/lccmake.bat
stx/goodies/metacello/base/libInit.cc
stx/goodies/metacello/base/mingwmake.bat
stx/goodies/metacello/base/stx_goodies_metacello_base.st
stx/goodies/metacello/base/vcmake.bat
stx/goodies/metacello/bc.mak
stx/goodies/metacello/bmake.bat
stx/goodies/metacello/core/Make.proto
stx/goodies/metacello/core/Make.spec
stx/goodies/metacello/core/Makefile.init
stx/goodies/metacello/core/MetacelloAbstractConstructor.st
stx/goodies/metacello/core/MetacelloAbstractPackageSpec.st
stx/goodies/metacello/core/MetacelloAbstractVersionConstructor.st
stx/goodies/metacello/core/MetacelloAddMemberSpec.st
stx/goodies/metacello/core/MetacelloAllowConflictingProjectUpgrade.st
stx/goodies/metacello/core/MetacelloAllowProjectDowngrade.st
stx/goodies/metacello/core/MetacelloAllowProjectUpgrade.st
stx/goodies/metacello/core/MetacelloBaseConfiguration.st
stx/goodies/metacello/core/MetacelloBaselineConstructor.st
stx/goodies/metacello/core/MetacelloBaselineSpecGenerator.st
stx/goodies/metacello/core/MetacelloCannotUpdateReleasedVersionError.st
stx/goodies/metacello/core/MetacelloCleanLoadAndTestsNotification.st
stx/goodies/metacello/core/MetacelloCleanLoadNotification.st
stx/goodies/metacello/core/MetacelloCleanNotification.st
stx/goodies/metacello/core/MetacelloClearStackCacheNotification.st
stx/goodies/metacello/core/MetacelloConfigurationSpecGenerator.st
stx/goodies/metacello/core/MetacelloConflictingProjectError.st
stx/goodies/metacello/core/MetacelloCopyMemberSpec.st
stx/goodies/metacello/core/MetacelloErrorInProjectConstructionNotification.st
stx/goodies/metacello/core/MetacelloGenericProjectSpec.st
stx/goodies/metacello/core/MetacelloGroupSpec.st
stx/goodies/metacello/core/MetacelloLockedProjectError.st
stx/goodies/metacello/core/MetacelloLookupBaselineSpecForEnsureLoad.st
stx/goodies/metacello/core/MetacelloLookupProjectSpec.st
stx/goodies/metacello/core/MetacelloLookupProjectSpecForLoad.st
stx/goodies/metacello/core/MetacelloMemberListSpec.st
stx/goodies/metacello/core/MetacelloMemberSpec.st
stx/goodies/metacello/core/MetacelloMergeMemberSpec.st
stx/goodies/metacello/core/MetacelloMethodSection.st
stx/goodies/metacello/core/MetacelloMethodSectionPath.st
stx/goodies/metacello/core/MetacelloMethodSpec.st
stx/goodies/metacello/core/MetacelloPackageSpecResolutionError.st
stx/goodies/metacello/core/MetacelloPackagesSpec.st
stx/goodies/metacello/core/MetacelloPlatform.st
stx/goodies/metacello/core/MetacelloProject.st
stx/goodies/metacello/core/MetacelloProjectReferenceSpec.st
stx/goodies/metacello/core/MetacelloProjectRegistration.st
stx/goodies/metacello/core/MetacelloProjectRegistry.st
stx/goodies/metacello/core/MetacelloProjectSpec.st
stx/goodies/metacello/core/MetacelloProjectSpecForLoad.st
stx/goodies/metacello/core/MetacelloProjectSpecGenerator.st
stx/goodies/metacello/core/MetacelloProjectSpecLoadConflict.st
stx/goodies/metacello/core/MetacelloProjectSpecLoadError.st
stx/goodies/metacello/core/MetacelloProjectSpecLoadedNotification.st
stx/goodies/metacello/core/MetacelloRemoveMemberSpec.st
stx/goodies/metacello/core/MetacelloResolveProjectUpgrade.st
stx/goodies/metacello/core/MetacelloScriptApiExecutor.st
stx/goodies/metacello/core/MetacelloScriptEngine.st
stx/goodies/metacello/core/MetacelloScriptEnsureProjectLoadedForDevelopment.st
stx/goodies/metacello/core/MetacelloScriptExecutor.st
stx/goodies/metacello/core/MetacelloScriptGitHubDownloadNotification.st
stx/goodies/metacello/core/MetacelloScriptImageExecutor.st
stx/goodies/metacello/core/MetacelloScriptNotification.st
stx/goodies/metacello/core/MetacelloScriptProjectSpecNotification.st
stx/goodies/metacello/core/MetacelloScriptRegistryExecutor.st
stx/goodies/metacello/core/MetacelloScriptingError.st
stx/goodies/metacello/core/MetacelloSemanticVersionNumber.st
stx/goodies/metacello/core/MetacelloSkipDirtyPackageLoad.st
stx/goodies/metacello/core/MetacelloSpec.st
stx/goodies/metacello/core/MetacelloSpecLoader.st
stx/goodies/metacello/core/MetacelloStackCacheNotification.st
stx/goodies/metacello/core/MetacelloSymbolicVersionDoesNotExistError.st
stx/goodies/metacello/core/MetacelloSymbolicVersionMethodSpec.st
stx/goodies/metacello/core/MetacelloSymbolicVersionNotDefinedError.st
stx/goodies/metacello/core/MetacelloSymbolicVersionSpec.st
stx/goodies/metacello/core/MetacelloToolBoxConstructor.st
stx/goodies/metacello/core/MetacelloUseUpgradeError.st
stx/goodies/metacello/core/MetacelloValidationCriticalWarning.st
stx/goodies/metacello/core/MetacelloValidationError.st
stx/goodies/metacello/core/MetacelloValidationFailure.st
stx/goodies/metacello/core/MetacelloValidationIssue.st
stx/goodies/metacello/core/MetacelloValidationNotification.st
stx/goodies/metacello/core/MetacelloValidationWarning.st
stx/goodies/metacello/core/MetacelloValueHolderSpec.st
stx/goodies/metacello/core/MetacelloVersion.st
stx/goodies/metacello/core/MetacelloVersionConstructor.st
stx/goodies/metacello/core/MetacelloVersionDefinitionError.st
stx/goodies/metacello/core/MetacelloVersionDoesNotExistError.st
stx/goodies/metacello/core/MetacelloVersionMethodSection.st
stx/goodies/metacello/core/MetacelloVersionMethodSpec.st
stx/goodies/metacello/core/MetacelloVersionNumber.st
stx/goodies/metacello/core/MetacelloVersionSpec.st
stx/goodies/metacello/core/MetacelloVersionValidator.st
stx/goodies/metacello/core/abbrev.stc
stx/goodies/metacello/core/bc.mak
stx/goodies/metacello/core/bmake.bat
stx/goodies/metacello/core/core.rc
stx/goodies/metacello/core/extensions.st
stx/goodies/metacello/core/lccmake.bat
stx/goodies/metacello/core/libInit.cc
stx/goodies/metacello/core/mingwmake.bat
stx/goodies/metacello/core/stx_goodies_metacello_core.st
stx/goodies/metacello/core/vcmake.bat
stx/goodies/metacello/lccmake.bat
stx/goodies/metacello/libInit.cc
stx/goodies/metacello/metacello.rc
stx/goodies/metacello/mingwmake.bat
stx/goodies/metacello/stx/Make.proto
stx/goodies/metacello/stx/Make.spec
stx/goodies/metacello/stx/Makefile.init
stx/goodies/metacello/stx/MetacelloStXPackageSpec.st
stx/goodies/metacello/stx/MetacelloStXPlatform.st
stx/goodies/metacello/stx/MetacelloStXProject.st
stx/goodies/metacello/stx/MetacelloStXRepositoriesSpec.st
stx/goodies/metacello/stx/MetacelloStXRepositorySpec.st
stx/goodies/metacello/stx/MetacelloStXVersion.st
stx/goodies/metacello/stx/MetacelloStXVersionConstructor.st
stx/goodies/metacello/stx/MetacelloStXVersionSpec.st
stx/goodies/metacello/stx/abbrev.stc
stx/goodies/metacello/stx/bc.mak
stx/goodies/metacello/stx/bmake.bat
stx/goodies/metacello/stx/extensions.st
stx/goodies/metacello/stx/lccmake.bat
stx/goodies/metacello/stx/libInit.cc
stx/goodies/metacello/stx/mingwmake.bat
stx/goodies/metacello/stx/stx.rc
stx/goodies/metacello/stx/stx_goodies_metacello_stx.st
stx/goodies/metacello/stx/vcmake.bat
stx/goodies/metacello/stx_goodies_metacello.st
stx/goodies/metacello/vcmake.bat
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/Make.proto	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,152 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# The Makefile as generated by this Make.proto supports the following targets:
+#    make         - compile all st-files to a classLib
+#    make clean   - clean all temp files
+#    make clobber - clean all
+#
+# This file contains definitions for Unix based platforms.
+# It shares common definitions with the win32-make in Make.spec.
+
+#
+# position (of this package) in directory hierarchy:
+# (must point to ST/X top directory, for tools and includes)
+TOP=../..
+INCLUDE_TOP=$(TOP)/..
+
+# subdirectories where targets are to be made:
+SUBDIRS=
+
+
+# subdirectories where Makefiles are to be made:
+# (only define if different from SUBDIRS)
+# ALLSUBDIRS=
+
+REQUIRED_SUPPORT_DIRS=
+
+# if your embedded C code requires any system includes,
+# add the path(es) here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALINCLUDES=-Ifoo -Ibar
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libbasic
+
+
+# if you need any additional defines for embedded C code,
+# add them here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALDEFINES=-Dfoo -Dbar -DDEBUG
+LOCALDEFINES=
+
+LIBNAME=libstx_goodies_metacello
+STCLOCALOPT='-package=$(PACKAGE)' -I. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -headerDir=.  -varPrefix=$(LIBNAME)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C-libraries that should be pre-linked with the class-objects
+LD_OBJ_LIBS=
+LOCAL_SHARED_LIBS=
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C targets or libraries should be added below
+LOCAL_EXTRA_TARGETS=
+
+OBJS= $(COMMON_OBJS) $(UNIX_OBJS)
+
+
+
+all:: preMake classLibRule postMake
+
+pre_objs::  
+
+
+
+
+# Update SVN revision in package definition class
+ifneq (,$(findstring .svn,$(wildcard .svn)))
+.svnversion: *.st
+	if [ -d .svn ]; then \
+		rev=$(shell svnversion -n); \
+		echo -n $$rev > .svnversion; \
+	else \
+		echo -n exported > .svnversion; \
+	fi
+
+stx_goodies_metacello.o: stx_goodies_metacello.st .svnversion
+	@if [ -d .svn ]; then \
+		rev2="$(shell printf "%-16s" $$(cat .svnversion))"; \
+		echo "  [SV]  Expanding svnRevisionNo in $1.st"; \
+		sed -e "s/\"\$$SVN\-Revision:\".*\"\$$\"/\"\$$SVN-Revision:\"\'$$rev2\'\"\$$\"/g" $< > .stx_goodies_metacello.svn.st; \
+	fi
+	$(MAKE) CC="$(CLASSLIB_CC)" OPT="$(OPT)" SEPINITCODE="$(SEPINITCODE)" STC="$(STC)" STFILE=.stx_goodies_metacello.svn $(C_RULE);
+	sed -i -e "s/\".stx_goodies_metacello.svn.st\");/\"\stx_goodies_metacello.st\");/g" .stx_goodies_metacello.svn.c
+	$(MAKE) .stx_goodies_metacello.svn.$(O)
+	@mv .stx_goodies_metacello.svn.$(O) stx_goodies_metacello.$(O)
+endif
+
+
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+ifneq (**NOHG**, $(shell hg root 2> /dev/null || echo -n '**NOHG**'))
+stx_goodies_metacello.$(O): $(shell hg root)/.hg/dirstate
+endif
+
+
+
+
+# run default testsuite for this package
+test: $(TOP)/goodies/builder/reports
+	$(MAKE) -C $(TOP)/goodies/builder/reports -f Makefile.init
+	$(TOP)/goodies/builder/reports/report-runner.sh -D . -r Builder::TestReport -p $(PACKAGE)
+
+
+
+# add more install actions here
+install::
+
+# add more install actions for aux-files (resources) here
+installAux::
+
+# add more preMake actions here
+preMake::
+
+# add more postMake actions here
+postMake:: cleanjunk
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+	cd ../../libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd base && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd core && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd stx && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+
+
+
+# build all packages containing referenced classes for this package
+# they are nor needed to compile the package
+references:
+
+
+cleanjunk::
+	-rm -f *.s *.s2
+
+clean::
+	-rm -f *.o *.H
+
+clobber:: clean
+	-rm -f *.so *.dll
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)stx_goodies_metacello.$(O) stx_goodies_metacello.$(H): stx_goodies_metacello.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/Make.spec	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,62 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# This file contains specifications which are common to all platforms.
+#
+
+# Do NOT CHANGE THESE DEFINITIONS
+# (otherwise, ST/X will have a hard time to find out the packages location from its packageID,
+#  to find the source code of a class and to find the library for a package)
+MODULE=stx
+MODULE_DIR=goodies/metacello
+PACKAGE=$(MODULE):$(MODULE_DIR)
+
+
+# Argument(s) to the stc compiler (stc --usage).
+#  -headerDir=. : create header files locally
+#                (if removed, they will be created as common
+#  -Pxxx       : defines the package
+#  -Zxxx       : a prefix for variables within the classLib
+#  -Dxxx       : defines passed to to CC for inline C-code
+#  -Ixxx       : include path passed to CC for inline C-code
+#  +optspace   : optimized for space
+#  +optspace2  : optimized more for space
+#  +optspace3  : optimized even more for space
+#  +optinline  : generate inline code for some ST constructs
+#  +inlineNew  : additionally inline new
+#  +inlineMath : additionally inline some floatPnt math stuff
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCLOCALOPTIMIZATIONS=+optinline +inlineNew
+# STCLOCALOPTIMIZATIONS=+optspace3
+STCLOCALOPTIMIZATIONS=+optspace3
+
+
+# Argument(s) to the stc compiler (stc --usage).
+#  -warn            : no warnings
+#  -warnNonStandard : no warnings about ST/X extensions
+#  -warnEOLComments : no warnings about EOL comment extension
+#  -warnPrivacy     : no warnings about privateClass extension
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCWARNINGS=-warn
+# STCWARNINGS=-warnNonStandard
+# STCWARNINGS=-warnEOLComments
+STCWARNINGS=-warnNonStandard
+
+COMMON_CLASSES= \
+	stx_goodies_metacello \
+
+
+
+
+COMMON_OBJS= \
+    $(OUTDIR_SLASH)stx_goodies_metacello.$(O) \
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/Makefile.init	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,27 @@
+#
+# DO NOT EDIT
+#
+# make uses this file (Makefile) only, if there is no
+# file named "makefile" (lower-case m) in the same directory.
+# My only task is to generate the real makefile and call make again.
+# Thereafter, I am no longer used and needed.
+#
+# MACOSX caveat:
+#   as filenames are not case sensitive (in a default setup),
+#   we cannot use the above trick. Therefore, this file is now named
+#   "Makefile.init", and you have to execute "make -f Makefile.init" to
+#   get the initial makefile.  This is now also done by the toplevel CONFIG
+#   script.
+
+.PHONY: run
+
+run: makefile
+	$(MAKE) -f makefile
+
+#only needed for the definition of $(TOP)
+include Make.proto
+
+makefile: mf
+
+mf:
+	$(TOP)/rules/stmkmf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/abbrev.stc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,4 @@
+# automagically generated by the project definition
+# this file is needed for stc to be able to compile modules independently.
+# it provides information about a classes filename, category and especially namespace.
+stx_goodies_metacello stx_goodies_metacello stx:goodies/metacello '* Projects & Packages *' 3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/BaselineOf.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,31 @@
+"{ Package: 'stx:goodies/metacello/base' }"
+
+ConfigurationOf subclass:#BaselineOf
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Base'
+!
+
+
+!BaselineOf methodsFor:'accessing'!
+
+projectClass
+    ^ MetacelloMCBaselineProject
+!
+
+versionNumberClass
+    ^ MetacelloVersionNumber
+! !
+
+!BaselineOf class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/ConfigurationOf.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,254 @@
+"{ Package: 'stx:goodies/metacello/base' }"
+
+Object subclass:#ConfigurationOf
+	instanceVariableNames:'project'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Base'
+!
+
+
+!ConfigurationOf class methodsFor:'accessing'!
+
+project
+
+	^self new project
+!
+
+validate
+	"Check the configuration for Errors, Critical Warnings, and Warnings (see class comment for MetacelloMCVersionValidator for more information). 
+	Errors identify specification issues that will result in unexpected behaviour when you load the configuration. 
+	Critical Warnings identify specification issues that may result in unexpected behavior when you load the configuration.
+	Warnings identify specification issues that are technically correct, but are worth take a look at."
+
+	"self validate"
+
+	<apiDocumentation>
+	self ensureMetacello.
+	^ ((Smalltalk at: #MetacelloToolBox) validateConfiguration: self debug: #() recurse: false) explore
+! !
+
+!ConfigurationOf class methodsFor:'private'!
+
+bootstrapMetacelloFrom: repositoryUrl
+    "Corresponds to version 1.0-beta.32.2"
+
+    "KEEP MetacelloConfigTemplate class>>ensureMetacelloBaseConfiguration in synch!!"
+
+    | platformPkg |
+    self ensureGoferVersion: 'Gofer-Core-lr.115' repositoryUrl: repositoryUrl.
+    #('Metacello-Base-dkh.96' 'Metacello-Core-dkh.664' 'Metacello-MC-dkh.656')
+        do: [ :pkg | self bootstrapPackage: pkg from: repositoryUrl ].
+    platformPkg := Smalltalk
+        at: #'SystemVersion'
+        ifPresent: [ :cl | 
+            | versionString |
+            versionString := cl current version.
+            (versionString beginsWith: 'Squeak')
+                ifTrue: [ 
+                    (versionString beginsWith: 'Squeak3')
+                        ifTrue: [ 'Metacello-Platform.squeak-dkh.5' ]
+                        ifFalse: [ 'Metacello-Platform.squeak-dkh.13' ] ]
+                ifFalse: [ 
+                    (versionString beginsWith: 'Pharo')
+                        ifTrue: [ 'Metacello-Platform.pharo-dkh.27' ] ] ].
+    self bootstrapPackage: platformPkg from: repositoryUrl
+!
+
+bootstrapPackage: aString from: aPath 
+	| repository version |
+	repository := (MCCacheRepository default includesVersionNamed: aString)
+		ifTrue: [MCCacheRepository default]
+		ifFalse: [MCHttpRepository
+				location: aPath
+				user: ''
+				password: ''].
+	repository
+		versionReaderForFileNamed: aString , '.mcz'
+		do: [:reader | 
+			version := reader version.
+			version load.
+			version workingCopy repositoryGroup addRepository: repository]
+!
+
+ensureGoferVersion: goferVersion repositoryUrl: repositoryUrl
+    "load the p=file goferVersion if Gofer isn't loaded or an earlier version of Gofer is currently loaded"
+
+    | goferVersionNumber wc pName |
+    (Smalltalk at: #'Gofer' ifAbsent: [  ]) == nil
+        ifTrue: [ ^ self bootstrapPackage: goferVersion from: repositoryUrl ].
+    goferVersionNumber := (goferVersion copyAfterLast: $.) asNumber.
+    wc := [ ((Smalltalk at: #'GoferPackageReference') name: 'Gofer') workingCopy ]
+        on: Error
+        do: [ :ex | ex return: ((Smalltalk at: #'GoferPackageReference') name: 'Gofer-Core') workingCopy ].
+    pName := wc ancestry ancestors first name.
+    (pName copyAfterLast: $.) asNumber <= goferVersionNumber
+        ifTrue: [ self bootstrapPackage: goferVersion from: repositoryUrl ]
+!
+
+ensureMetacello
+    "Bootstrap Metacello and load the 'botstrap' group"
+
+    self ensureMetacello: #('batch')
+!
+
+ensureMetacello: loadList
+    "Bootstrap Metacello, retry using alternate repository, if primary repository is not accessible"
+
+    Smalltalk
+        at: #'MetacelloProject'
+        ifAbsent: [ 
+            | retry version error gofer |
+            retry := false.
+            (Array with: 'http://seaside.gemstone.com/ss/metacello' with: 'http://www.squeaksource.com/metacello')
+                do: [ :repositoryUrl | 
+                    [ 
+                    "bootstrap Metacello"
+                    self bootstrapMetacelloFrom: repositoryUrl.
+                    Smalltalk
+                        at: #'ConfigurationOfMetacello'
+                        ifAbsent: [ 
+                            gofer := (Smalltalk at: #'Gofer') new.
+                            gofer
+                                perform: #'url:' with: repositoryUrl;
+                                perform: #'package:' with: 'ConfigurationOfMetacello';
+                                perform: #'load' ].
+                    version := (Smalltalk at: #'ConfigurationOfMetacello') project version: '1.0-beta.32'.	"bootstrap with 1.0-beta.32"
+                    retry
+                        ifTrue: [ 
+                            "on retry, use #repositoryOverrides:"
+                            version
+                                repositoryOverrides:
+                                    (Array with: (MCHttpRepository location: repositoryUrl user: '' password: '')) ].
+                    version load: loadList.
+                    gofer := (Smalltalk at: #'Gofer') new.
+                    Smalltalk
+                        at: #'ConfigurationOfMetacelloPreview'
+                        ifAbsent: [ 
+                            gofer
+                                perform: #'url:' with: repositoryUrl;
+                                perform: #'package:' with: 'ConfigurationOfMetacelloPreview';
+                                perform: #'load' ].
+                    version := (Smalltalk at: #'ConfigurationOfMetacelloPreview') project version: '1.0.0-beta.32.2'.	"load latest from GitHub"
+                    version load: loadList.
+                    ^ self ]
+                        on: Error
+                        do: [ :ex | 
+                            error := ex.
+                            Transcript
+                                cr;
+                                show: 'failed ensureMetacello: ';
+                                show: ex description printString;
+                                show: '...retrying'.	"try again"
+                            retry := true.
+                            ex return: nil ] ].	"shouldn't get here unless the load failed ... throw an error"
+            self error: 'retry with alternate repository failed: ' , error description printString ]
+! !
+
+!ConfigurationOf class methodsFor:'unloading Metacello'!
+
+unloadMetacello
+	"Unload the classes that implement Metacello. Metacello is not needed once a project has been loaded, so it can safely be unloaded."
+
+	"self unloadMetacello"
+
+	<apiDocumentation>
+	| gofer |
+	gofer := (Smalltalk at: #Gofer) new.
+	MCWorkingCopy allManagers do: [:wc |
+		((wc packageName beginsWith: 'Metacello') or: [ wc packageName beginsWith: 'OB-Metacello' ])
+			ifTrue: [ gofer package: wc packageName ]].
+	gofer unload.
+! !
+
+!ConfigurationOf methodsFor:'accessing'!
+
+customProjectAttributes
+    "Edit to return a collection of any custom attributes e.g. for conditional loading: Array with: #'Condition1' with: #'Condition2.
+	For more information see: http://code.google.com/p/metacello/wiki/CustomProjectAttrributes "
+
+    ^ #()
+!
+
+project
+    ^ project
+        ifNil: [ 
+            "Bootstrap Metacello if it is not already loaded"
+            self class ensureMetacello.
+            project := self projectClass new projectAttributes: self customProjectAttributes.	"Create the Metacello project"
+            project versionNumberClass: self versionNumberClass.
+            project class versionConstructorClass on: self project: project.	"Construct the project"
+            project loadType: #'linear'.	"change to #atomic if desired"
+            project ]
+!
+
+project: aProject
+
+	project ifNil: [ self class ensureMetacello ].
+	project := aProject
+!
+
+projectClass
+
+    | cls |
+
+    "Hmm...hmm...what to return here. In master, MetacelloMCProject is
+    returned, which seem to be incorrect as it implies dependency on
+    Metacello-MC. On the other hand, MetacelloProject is just an abstract 
+    class. Let's try following for now:"
+
+    cls := Smalltalk at:#MetacelloStXProject.
+    cls notNil ifTrue:[ ^ cls ].
+    cls := Smalltalk at:#MetacelloMCProject.
+    cls notNil ifTrue:[ ^ cls ].
+    "/ last resort...
+    ^ MetacelloStXProject
+
+    "Modified: / 10-09-2012 / 22:11:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+versionNumberClass
+
+    "Use Smalltalk>>at: to trick the dependency collector. However,
+     this looks like unwanted dependency anyway..."
+    ^Smalltalk at:#MetacelloSemanticVersionNumber ifAbsent:[
+        self error:'MetacelloSemanticVersionNumber class not present'.
+    ].
+
+    "Modified: / 10-09-2012 / 22:07:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!ConfigurationOf methodsFor:'defaults'!
+
+bleedingEdge 
+	"override if different behavior desired.
+	 Use:
+		self versionDoesNotExistError: #bleedingEdge
+	 if #bleedingEdge version is disallowed."
+
+	<defaultSymbolicVersion: #bleedingEdge>
+	
+	^self defaultBleedingEdgeVersion
+!
+
+defaultBleedingEdgeVersion
+	| bleedingEdgeVersion |
+	bleedingEdgeVersion := (self project map values select: [ :version | version blessing == #baseline ])
+		detectMax: [ :version | version ].
+	bleedingEdgeVersion ifNil: [ ^#'notDefined' ].
+	^ bleedingEdgeVersion versionString
+! !
+
+!ConfigurationOf methodsFor:'private'!
+
+versionDoesNotExistError: versionStringOrSymbol
+
+	((Smalltalk at: #MetacelloSymbolicVersionDoesNotExistError) project: self project versionString: versionStringOrSymbol) signal
+! !
+
+!ConfigurationOf class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/Make.proto	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,152 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_base.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# The Makefile as generated by this Make.proto supports the following targets:
+#    make         - compile all st-files to a classLib
+#    make clean   - clean all temp files
+#    make clobber - clean all
+#
+# This file contains definitions for Unix based platforms.
+# It shares common definitions with the win32-make in Make.spec.
+
+#
+# position (of this package) in directory hierarchy:
+# (must point to ST/X top directory, for tools and includes)
+TOP=../../..
+INCLUDE_TOP=$(TOP)/..
+
+# subdirectories where targets are to be made:
+SUBDIRS=
+
+
+# subdirectories where Makefiles are to be made:
+# (only define if different from SUBDIRS)
+# ALLSUBDIRS=
+
+REQUIRED_SUPPORT_DIRS=
+
+# if your embedded C code requires any system includes,
+# add the path(es) here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALINCLUDES=-Ifoo -Ibar
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libbasic
+
+
+# if you need any additional defines for embedded C code,
+# add them here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALDEFINES=-Dfoo -Dbar -DDEBUG
+LOCALDEFINES=
+
+LIBNAME=libstx_goodies_metacello_base
+STCLOCALOPT='-package=$(PACKAGE)' -I. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -headerDir=.  -varPrefix=$(LIBNAME)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C-libraries that should be pre-linked with the class-objects
+LD_OBJ_LIBS=
+LOCAL_SHARED_LIBS=
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C targets or libraries should be added below
+LOCAL_EXTRA_TARGETS=
+
+OBJS= $(COMMON_OBJS) $(UNIX_OBJS)
+
+
+
+all:: preMake classLibRule postMake
+
+pre_objs::  
+
+
+
+
+# Update SVN revision in package definition class
+ifneq (,$(findstring .svn,$(wildcard .svn)))
+.svnversion: *.st
+	if [ -d .svn ]; then \
+		rev=$(shell svnversion -n); \
+		echo -n $$rev > .svnversion; \
+	else \
+		echo -n exported > .svnversion; \
+	fi
+
+stx_goodies_metacello_base.o: stx_goodies_metacello_base.st .svnversion
+	@if [ -d .svn ]; then \
+		rev2="$(shell printf "%-16s" $$(cat .svnversion))"; \
+		echo "  [SV]  Expanding svnRevisionNo in $1.st"; \
+		sed -e "s/\"\$$SVN\-Revision:\".*\"\$$\"/\"\$$SVN-Revision:\"\'$$rev2\'\"\$$\"/g" $< > .stx_goodies_metacello_base.svn.st; \
+	fi
+	$(MAKE) CC="$(CLASSLIB_CC)" OPT="$(OPT)" SEPINITCODE="$(SEPINITCODE)" STC="$(STC)" STFILE=.stx_goodies_metacello_base.svn $(C_RULE);
+	sed -i -e "s/\".stx_goodies_metacello_base.svn.st\");/\"\stx_goodies_metacello_base.st\");/g" .stx_goodies_metacello_base.svn.c
+	$(MAKE) .stx_goodies_metacello_base.svn.$(O)
+	@mv .stx_goodies_metacello_base.svn.$(O) stx_goodies_metacello_base.$(O)
+endif
+
+
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+ifneq (**NOHG**, $(shell hg root 2> /dev/null || echo -n '**NOHG**'))
+stx_goodies_metacello_base.$(O): $(shell hg root)/.hg/dirstate
+endif
+
+
+
+
+# run default testsuite for this package
+test: $(TOP)/goodies/builder/reports
+	$(MAKE) -C $(TOP)/goodies/builder/reports -f Makefile.init
+	$(TOP)/goodies/builder/reports/report-runner.sh -D . -r Builder::TestReport -p $(PACKAGE)
+
+
+
+# add more install actions here
+install::
+
+# add more install actions for aux-files (resources) here
+installAux::
+
+# add more preMake actions here
+preMake::
+
+# add more postMake actions here
+postMake:: cleanjunk
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+	cd ../../../libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+
+
+
+# build all packages containing referenced classes for this package
+# they are nor needed to compile the package
+references:
+
+
+cleanjunk::
+	-rm -f *.s *.s2
+
+clean::
+	-rm -f *.o *.H
+
+clobber:: clean
+	-rm -f *.so *.dll
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)ConfigurationOf.$(O) ConfigurationOf.$(H): ConfigurationOf.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)Metacello.$(O) Metacello.$(H): Metacello.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_base.$(O) stx_goodies_metacello_base.$(H): stx_goodies_metacello_base.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)BaselineOf.$(O) BaselineOf.$(H): BaselineOf.st $(INCLUDE_TOP)/stx/goodies/metacello/base/ConfigurationOf.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/Make.spec	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,68 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_base.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# This file contains specifications which are common to all platforms.
+#
+
+# Do NOT CHANGE THESE DEFINITIONS
+# (otherwise, ST/X will have a hard time to find out the packages location from its packageID,
+#  to find the source code of a class and to find the library for a package)
+MODULE=stx
+MODULE_DIR=goodies/metacello/base
+PACKAGE=$(MODULE):$(MODULE_DIR)
+
+
+# Argument(s) to the stc compiler (stc --usage).
+#  -headerDir=. : create header files locally
+#                (if removed, they will be created as common
+#  -Pxxx       : defines the package
+#  -Zxxx       : a prefix for variables within the classLib
+#  -Dxxx       : defines passed to to CC for inline C-code
+#  -Ixxx       : include path passed to CC for inline C-code
+#  +optspace   : optimized for space
+#  +optspace2  : optimized more for space
+#  +optspace3  : optimized even more for space
+#  +optinline  : generate inline code for some ST constructs
+#  +inlineNew  : additionally inline new
+#  +inlineMath : additionally inline some floatPnt math stuff
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCLOCALOPTIMIZATIONS=+optinline +inlineNew
+# STCLOCALOPTIMIZATIONS=+optspace3
+STCLOCALOPTIMIZATIONS=+optspace3
+
+
+# Argument(s) to the stc compiler (stc --usage).
+#  -warn            : no warnings
+#  -warnNonStandard : no warnings about ST/X extensions
+#  -warnEOLComments : no warnings about EOL comment extension
+#  -warnPrivacy     : no warnings about privateClass extension
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCWARNINGS=-warn
+# STCWARNINGS=-warnNonStandard
+# STCWARNINGS=-warnEOLComments
+STCWARNINGS=-warnNonStandard
+
+COMMON_CLASSES= \
+	ConfigurationOf \
+	Metacello \
+	stx_goodies_metacello_base \
+	BaselineOf \
+
+
+
+
+COMMON_OBJS= \
+    $(OUTDIR_SLASH)ConfigurationOf.$(O) \
+    $(OUTDIR_SLASH)Metacello.$(O) \
+    $(OUTDIR_SLASH)stx_goodies_metacello_base.$(O) \
+    $(OUTDIR_SLASH)BaselineOf.$(O) \
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/Makefile.init	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,27 @@
+#
+# DO NOT EDIT
+#
+# make uses this file (Makefile) only, if there is no
+# file named "makefile" (lower-case m) in the same directory.
+# My only task is to generate the real makefile and call make again.
+# Thereafter, I am no longer used and needed.
+#
+# MACOSX caveat:
+#   as filenames are not case sensitive (in a default setup),
+#   we cannot use the above trick. Therefore, this file is now named
+#   "Makefile.init", and you have to execute "make -f Makefile.init" to
+#   get the initial makefile.  This is now also done by the toplevel CONFIG
+#   script.
+
+.PHONY: run
+
+run: makefile
+	$(MAKE) -f makefile
+
+#only needed for the definition of $(TOP)
+include Make.proto
+
+makefile: mf
+
+mf:
+	$(TOP)/rules/stmkmf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/Metacello.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,260 @@
+"{ Package: 'stx:goodies/metacello/base' }"
+
+Object subclass:#Metacello
+	instanceVariableNames:'executorSpec statements'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Base'
+!
+
+
+!Metacello class methodsFor:'instance creation'!
+
+classic
+    "set the options such that the load performed will be identical to the classic ConfigurationOf load:
+	(ConfigurationOfExample project version: '1.0') load
+	
+	#classic forces Metacello to look at image state to determine which version of a project is loaded instead of using
+		the registry to tell us explicitly which version of a project is loaded .. image state is not PRECISE"
+
+    "useCurrentVersion is a 'private' option for enforcing classic rules, so it's not part of scripting api"
+
+    ^ self new
+        onUpgrade: [ :ex | ex allow ];
+        onConflict: [ :ex | ex allow ];
+        addStatement: #'useCurrentVersion:' args: {true};
+        yourself
+!
+
+image
+    ^ self new
+        executorSpec: #'MetacelloScriptImageExecutor' -> 'batch';
+        yourself
+!
+
+registry
+    ^ self new
+        executorSpec: #'MetacelloScriptRegistryExecutor' -> 'batch';
+        yourself
+! !
+
+!Metacello class methodsFor:'private'!
+
+scriptExecutorClass
+    ^ self scriptExecutorClass: {(#'MetacelloScriptApiExecutor' -> 'batch')}
+!
+
+scriptExecutorClass: anExecutorSpec
+    Smalltalk at: anExecutorSpec key ifAbsent: [ ConfigurationOf ensureMetacello: anExecutorSpec value ].
+    ^ Smalltalk at: anExecutorSpec key
+! !
+
+!Metacello methodsFor:'accessing'!
+
+executorSpec
+    executorSpec ifNil: [ executorSpec := #'MetacelloScriptApiExecutor' -> 'batch' ].
+    ^ executorSpec
+!
+
+executorSpec: anAssoc
+    executorSpec := anAssoc
+!
+
+scriptExecutor
+    ^ (self class scriptExecutorClass: self executorSpec) new
+!
+
+statements
+    statements ifNil: [ statements := OrderedCollection new ].
+    ^ statements
+!
+
+statements: anObject
+	statements := anObject
+! !
+
+!Metacello methodsFor:'api actions'!
+
+fetch
+    self addStatement: #'fetch:' args: #(#()).
+    ^ self execute
+!
+
+fetch: required
+    self addStatement: #'fetch:' args: {required}.
+    ^ self execute
+!
+
+get
+    "resolve project name in given repository and return an instance of MetacelloProject resolved from a ConfigurationOf or BaselineOf"
+
+    self addStatement: #'get' args: #().
+    ^ self execute
+!
+
+list
+    "list projects in registry"
+
+    self addStatement: #'list' args: #().
+    ^ self execute
+!
+
+load
+    self addStatement: #'load:' args: #(#()).
+    ^ self execute
+!
+
+load: required
+    self addStatement: #'load:' args: {required}.
+    ^ self execute
+!
+
+lock
+    "lock projects in registry"
+
+    self addStatement: #'lock' args: #().
+    ^ self execute
+!
+
+record
+    self addStatement: #'record:' args: #(#()).
+    ^ self execute
+!
+
+record: required
+    self addStatement: #'record:' args: {required}.
+    ^ self execute
+!
+
+unlock
+    "unlock projects in registry"
+
+    self addStatement: #'unlock' args: #().
+    ^ self execute
+! !
+
+!Metacello methodsFor:'api options'!
+
+cacheRepository: aRepositoryDescription
+    self addStatement: #'cacheRepository:' args: {aRepositoryDescription}
+!
+
+ignoreImage
+    "ignore image state"
+
+    self addStatement: #'ignoreImage:' args: {true}
+!
+
+onConflict: aBlock
+    self addStatement: #'onConflict:' args: {aBlock}
+!
+
+onDowngrade: aBlock
+    self addStatement: #'onDowngrade:' args: {aBlock}
+!
+
+onUpgrade: aBlock
+    self addStatement: #'onUpgrade:' args: {aBlock}
+!
+
+repositoryOverrides: aRepositoryDescriptionCollection
+    self addStatement: #'repositoryOverrides:' args: {aRepositoryDescriptionCollection}
+!
+
+silently
+    "no progress bars"
+
+    self addStatement: #'silently:' args: {true}
+! !
+
+!Metacello methodsFor:'api projectSpec'!
+
+baseline: projectName
+    self addStatement: #'baselineArg:' args: {projectName}
+!
+
+className: className
+    self addStatement: #'classNameArg:' args: {className}
+!
+
+configuration: projectName
+    self addStatement: #'configurationArg:' args: {projectName}
+!
+
+project: projectName
+    self addStatement: #'projectArg:' args: {projectName}
+!
+
+repository: repositoryDescription
+    self addStatement: #'repositoryArg:' args: {repositoryDescription}
+!
+
+version: versionString
+    self addStatement: #'versionArg:' args: {versionString}
+! !
+
+!Metacello methodsFor:'api repository shortcuts'!
+
+blueplane: projectName
+    self repository: 'http://squeaksource.blueplane.jp/' , projectName
+!
+
+croquet: projectName
+    self repository: 'http://hedgehog.software.umn.edu:8888/' , projectName
+!
+
+gemsource: projectName
+    self repository: 'http://seaside.gemstone.com/ss/' , projectName
+!
+
+impara: projectName
+    self repository: 'http://source.impara.de/' , projectName
+!
+
+renggli: projectName
+    self repository: 'http://source.lukas-renggli.ch/' , projectName
+!
+
+saltypickle: projectName
+    self repository: 'http://squeak.saltypickle.com/' , projectName
+!
+
+squeakfoundation: projectName
+    self repository: 'http://source.squeakfoundation.org/' , projectName
+!
+
+squeaksource3: projectName
+    self repository: 'http://ss3.gemstone.com/ss/' , projectName
+!
+
+squeaksource: projectName
+    self repository: 'http://www.squeaksource.com/' , projectName
+!
+
+ss3: projectName
+    self squeaksource3: projectName
+!
+
+wiresong: projectName
+    self repository: 'http://source.wiresong.ca/' , projectName
+! !
+
+!Metacello methodsFor:'private'!
+
+addStatement: selector args: args
+    self statements add: selector -> args
+!
+
+execute
+    | script |
+    script := self statements.
+    self statements: nil.
+    ^ self scriptExecutor execute: script
+! !
+
+!Metacello class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/abbrev.stc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,7 @@
+# automagically generated by the project definition
+# this file is needed for stc to be able to compile modules independently.
+# it provides information about a classes filename, category and especially namespace.
+ConfigurationOf ConfigurationOf stx:goodies/metacello/base 'Metacello-Base' 0
+Metacello Metacello stx:goodies/metacello/base 'Metacello-Base' 0
+stx_goodies_metacello_base stx_goodies_metacello_base stx:goodies/metacello/base '* Projects & Packages *' 3
+BaselineOf BaselineOf stx:goodies/metacello/base 'Metacello-Base' 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/base.rc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+//
+// DO NOT EDIT
+// automagically generated from the projectDefinition: stx_goodies_metacello_base.
+//
+VS_VERSION_INFO VERSIONINFO
+  FILEVERSION     6,2,32767,32767
+  PRODUCTVERSION  6,2,4,0
+#if (__BORLANDC__)
+  FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
+  FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
+  FILEOS          VOS_NT_WINDOWS32
+  FILETYPE        VFT_DLL
+  FILESUBTYPE     VS_USER_DEFINED
+#endif
+
+BEGIN
+  BLOCK "StringFileInfo"
+  BEGIN
+    BLOCK "040904E4"
+    BEGIN
+      VALUE "CompanyName", "Dale Henrichs & Jan Vrany\0"
+      VALUE "FileDescription", "Metacello -- a Smalltalk project configuration management tool (LIB)\0"
+      VALUE "FileVersion", "6.2.32767.32767\0"
+      VALUE "InternalName", "stx:goodies/metacello/base\0"
+      VALUE "LegalCopyright", "Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)\0"
+      VALUE "ProductName", "Metacello\0"
+      VALUE "ProductVersion", "6.2.4.0\0"
+      VALUE "ProductDate", "Thu, 21 Aug 2014 08:17:41 GMT\0"
+    END
+
+  END
+
+  BLOCK "VarFileInfo"
+  BEGIN                               //  Language   |    Translation
+    VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
+  END
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/bc.mak	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,84 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_base.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# Notice, that the name bc.mak is historical (from times, when only borland c was supported).
+# This file contains make rules for the win32 platform using either borland-bcc or visual-c.
+# It shares common definitions with the unix-make in Make.spec.
+# The bc.mak supports the following targets:
+#    bmake         - compile all st-files to a classLib (dll)
+#    bmake clean   - clean all temp files
+#    bmake clobber - clean all
+#
+# Historic Note:
+#  this used to contain only rules to make with borland
+#    (called via bmake, by "make.exe -f bc.mak")
+#  this has changed; it is now also possible to build using microsoft visual c
+#    (called via vcmake, by "make.exe -f bc.mak -DUSEVC")
+#
+TOP=..\..\..
+INCLUDE_TOP=$(TOP)\..
+
+
+
+!INCLUDE $(TOP)\rules\stdHeader_bc
+
+!INCLUDE Make.spec
+
+LIBNAME=libstx_goodies_metacello_base
+RESFILES=base.$(RES)
+
+
+
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libbasic
+LOCALDEFINES=
+
+STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
+LOCALLIBS=
+
+OBJS= $(COMMON_OBJS) $(WIN32_OBJS)
+
+ALL::  classLibRule
+
+classLibRule: $(OUTDIR) $(OUTDIR)$(LIBNAME).dll
+
+!INCLUDE $(TOP)\rules\stdRules_bc
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+	pushd ..\..\..\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+
+
+
+
+
+
+
+test: $(TOP)\goodies\builder\reports\NUL
+	pushd $(TOP)\goodies\builder\reports & $(MAKE_BAT)
+	$(TOP)\goodies\builder\reports\report-runner.bat -D . -r Builder::TestReport -p $(PACKAGE)
+        
+clean::
+	del *.$(CSUFFIX)
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)ConfigurationOf.$(O) ConfigurationOf.$(H): ConfigurationOf.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)Metacello.$(O) Metacello.$(H): Metacello.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_base.$(O) stx_goodies_metacello_base.$(H): stx_goodies_metacello_base.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)BaselineOf.$(O) BaselineOf.$(H): BaselineOf.st $(INCLUDE_TOP)\stx\goodies\metacello\base\ConfigurationOf.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
+# **Must be at end**
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+!IFDEF HGROOT
+$(OUTDIR)stx_goodies_metacello_base.$(O): $(HGROOT)\.hg\dirstate
+!ENDIF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/bmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,12 @@
+@REM -------
+@REM make using Borland bcc32
+@REM type bmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak  %DEFINES% %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/lccmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,8 @@
+@REM -------
+@REM make using lcc compiler
+@REM type lccmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+make.exe -N -f bc.mak -DUSELCC=1 %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/libInit.cc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+/*
+ * $Header$
+ *
+ * DO NOT EDIT
+ * automagically generated from the projectDefinition: stx_goodies_metacello_base.
+ */
+#define __INDIRECTVMINITCALLS__
+#include <stc.h>
+
+#ifdef WIN32
+# pragma codeseg INITCODE "INITCODE"
+#endif
+
+#if defined(INIT_TEXT_SECTION) || defined(DLL_EXPORT)
+DLL_EXPORT void _libstx_goodies_metacello_base_Init() INIT_TEXT_SECTION;
+DLL_EXPORT void _libstx_goodies_metacello_base_InitDefinition() INIT_TEXT_SECTION;
+#endif
+
+void _libstx_goodies_metacello_base_InitDefinition(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_base__DFN", _libstx_goodies_metacello_base_InitDefinition, "stx:goodies/metacello/base");
+_stx_137goodies_137metacello_137base_Init(pass,__pRT__,snd);
+
+__END_PACKAGE__();
+}
+
+void _libstx_goodies_metacello_base_Init(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_base", _libstx_goodies_metacello_base_Init, "stx:goodies/metacello/base");
+_ConfigurationOf_Init(pass,__pRT__,snd);
+_Metacello_Init(pass,__pRT__,snd);
+_stx_137goodies_137metacello_137base_Init(pass,__pRT__,snd);
+_BaselineOf_Init(pass,__pRT__,snd);
+
+
+__END_PACKAGE__();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/mingwmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+@REM -------
+@REM make using mingw gnu compiler
+@REM type mingwmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+
+@pushd ..\..\..\rules
+@call find_mingw.bat
+@popd
+make.exe -N -f bc.mak %DEFINES% %USEMINGW_ARG% %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/stx_goodies_metacello_base.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,142 @@
+"{ Package: 'stx:goodies/metacello/base' }"
+
+LibraryDefinition subclass:#stx_goodies_metacello_base
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'* Projects & Packages *'
+!
+
+
+!stx_goodies_metacello_base class methodsFor:'description'!
+
+excludedFromPreRequisites
+    "list all packages which should be ignored in the automatic
+     preRequisites scan. See #preRequisites for more."
+
+    ^ #(
+        "Argh...Metacello-Base is so dependent on Monticello, but in St/X we don't want to have
+         this dependency. We don't use Monticello at all. "
+        #'stx:goodies/monticello'    "MCCacheRepository - referenced by ConfigurationOf class>>bootstrapPackage:from: "
+    )
+
+    "Modified: / 10-09-2012 / 22:24:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+preRequisites
+    "list all required packages.
+     This list can be maintained manually or (better) generated and
+     updated by scanning the superclass hierarchies and looking for
+     global variable accesses. (the browser has a menu function for that)
+     Howevery, often too much is found, and you may want to explicitely
+     exclude individual packages in the #excludedFromPrerequisites method."
+
+    ^ #(
+        #'stx:libbasic'    "LibraryDefinition - superclass of stx_goodies_metacello_base "
+    )
+
+    "Modified: / 10-09-2012 / 22:23:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello_base class methodsFor:'description - contents'!
+
+classNamesAndAttributes
+    "lists the classes which are to be included in the project.
+     Each entry in the list may be: a single class-name (symbol),
+     or an array-literal consisting of class name and attributes.
+     Attributes are: #autoload or #<os> where os is one of win32, unix,..."
+
+    ^ #(
+        "<className> or (<className> attributes...) in load order"
+        ConfigurationOf
+        Metacello
+        #'stx_goodies_metacello_base'
+        BaselineOf
+    )
+!
+
+extensionMethodNames
+    "lists the extension methods which are to be included in the project.
+     Entries are 2-element array literals, consisting of class-name and selector."
+
+    ^ #(
+    )
+! !
+
+!stx_goodies_metacello_base class methodsFor:'description - project information'!
+
+applicationIconFileName
+    "Return the name (without suffix) of an icon-file (the app's icon); will be included in the rc-resource file"
+
+    ^ nil
+    "/ ^ self applicationName
+!
+
+companyName
+    "Return a companyname which will appear in <lib>.rc"
+
+    ^ 'Dale Henrichs & Jan Vrany'
+
+    "Modified: / 10-09-2012 / 22:14:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+description
+    "Return a description string which will appear in vc.def / bc.def"
+
+    ^ 'Metacello -- a Smalltalk project configuration management tool'
+
+    "Modified: / 10-09-2012 / 22:15:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+legalCopyright
+    "Return a copyright string which will appear in <lib>.rc"
+
+    ^ 'Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)'
+
+    "Modified: / 10-09-2012 / 22:16:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+productInstallDirBaseName
+    "Returns a default installDir which will appear in <app>.nsi.
+     This is usually not the one you want to keep"
+
+    ^ (self package asCollectionOfSubstringsSeparatedByAny:':/') last
+!
+
+productName
+    "Return a product name which will appear in <lib>.rc"
+
+    ^ 'Metacello'
+
+    "Modified: / 10-09-2012 / 22:16:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello_base class methodsFor:'description - svn'!
+
+svnRepositoryUrlString
+    "Return a SVN repository URL of myself.
+     (Generated since 2011-04-08)
+     Do not make the string shorter!!!!!! We have to use fixed-length keyword!!!!!!
+    "        
+
+    ^ '$URL::                                                                                                                        $'
+!
+
+svnRevisionNr
+    "Return a SVN revision number of myself.
+     This number is updated after a commit"
+
+    ^ "$SVN-Revision:"'nil             '"$"
+! !
+
+!stx_goodies_metacello_base class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/vcmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,20 @@
+@REM -------
+@REM make using Microsoft Visual C compiler
+@REM type vcmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+
+@if not defined VSINSTALLDIR (
+    pushd ..\..\..\rules
+    call vcsetup.bat
+    popd
+)
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak -DUSEVC=1 %DEFINES% %*
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/bc.mak	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,84 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# Notice, that the name bc.mak is historical (from times, when only borland c was supported).
+# This file contains make rules for the win32 platform using either borland-bcc or visual-c.
+# It shares common definitions with the unix-make in Make.spec.
+# The bc.mak supports the following targets:
+#    bmake         - compile all st-files to a classLib (dll)
+#    bmake clean   - clean all temp files
+#    bmake clobber - clean all
+#
+# Historic Note:
+#  this used to contain only rules to make with borland
+#    (called via bmake, by "make.exe -f bc.mak")
+#  this has changed; it is now also possible to build using microsoft visual c
+#    (called via vcmake, by "make.exe -f bc.mak -DUSEVC")
+#
+TOP=..\..
+INCLUDE_TOP=$(TOP)\..
+
+
+
+!INCLUDE $(TOP)\rules\stdHeader_bc
+
+!INCLUDE Make.spec
+
+LIBNAME=libstx_goodies_metacello
+RESFILES=metacello.$(RES)
+
+
+
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libbasic
+LOCALDEFINES=
+
+STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
+LOCALLIBS=
+
+OBJS= $(COMMON_OBJS) $(WIN32_OBJS)
+
+ALL::  classLibRule
+
+classLibRule: $(OUTDIR) $(OUTDIR)$(LIBNAME).dll
+
+!INCLUDE $(TOP)\rules\stdRules_bc
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+	pushd ..\..\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd base & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd core & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd stx & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+
+
+
+
+
+
+
+test: $(TOP)\goodies\builder\reports\NUL
+	pushd $(TOP)\goodies\builder\reports & $(MAKE_BAT)
+	$(TOP)\goodies\builder\reports\report-runner.bat -D . -r Builder::TestReport -p $(PACKAGE)
+        
+clean::
+	del *.$(CSUFFIX)
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)stx_goodies_metacello.$(O) stx_goodies_metacello.$(H): stx_goodies_metacello.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
+# **Must be at end**
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+!IFDEF HGROOT
+$(OUTDIR)stx_goodies_metacello.$(O): $(HGROOT)\.hg\dirstate
+!ENDIF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/bmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,12 @@
+@REM -------
+@REM make using Borland bcc32
+@REM type bmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak  %DEFINES% %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/Make.proto	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,234 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_core.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# The Makefile as generated by this Make.proto supports the following targets:
+#    make         - compile all st-files to a classLib
+#    make clean   - clean all temp files
+#    make clobber - clean all
+#
+# This file contains definitions for Unix based platforms.
+# It shares common definitions with the win32-make in Make.spec.
+
+#
+# position (of this package) in directory hierarchy:
+# (must point to ST/X top directory, for tools and includes)
+TOP=../../..
+INCLUDE_TOP=$(TOP)/..
+
+# subdirectories where targets are to be made:
+SUBDIRS=
+
+
+# subdirectories where Makefiles are to be made:
+# (only define if different from SUBDIRS)
+# ALLSUBDIRS=
+
+REQUIRED_SUPPORT_DIRS=
+
+# if your embedded C code requires any system includes,
+# add the path(es) here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALINCLUDES=-Ifoo -Ibar
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/metacello/base -I$(INCLUDE_TOP)/stx/libbasic
+
+
+# if you need any additional defines for embedded C code,
+# add them here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALDEFINES=-Dfoo -Dbar -DDEBUG
+LOCALDEFINES=
+
+LIBNAME=libstx_goodies_metacello_core
+STCLOCALOPT='-package=$(PACKAGE)' -I. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -headerDir=.  -varPrefix=$(LIBNAME)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C-libraries that should be pre-linked with the class-objects
+LD_OBJ_LIBS=
+LOCAL_SHARED_LIBS=
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C targets or libraries should be added below
+LOCAL_EXTRA_TARGETS=
+
+OBJS= $(COMMON_OBJS) $(UNIX_OBJS)
+
+
+
+all:: preMake classLibRule postMake
+
+pre_objs::  
+
+
+
+
+# Update SVN revision in package definition class
+ifneq (,$(findstring .svn,$(wildcard .svn)))
+.svnversion: *.st
+	if [ -d .svn ]; then \
+		rev=$(shell svnversion -n); \
+		echo -n $$rev > .svnversion; \
+	else \
+		echo -n exported > .svnversion; \
+	fi
+
+stx_goodies_metacello_core.o: stx_goodies_metacello_core.st .svnversion
+	@if [ -d .svn ]; then \
+		rev2="$(shell printf "%-16s" $$(cat .svnversion))"; \
+		echo "  [SV]  Expanding svnRevisionNo in $1.st"; \
+		sed -e "s/\"\$$SVN\-Revision:\".*\"\$$\"/\"\$$SVN-Revision:\"\'$$rev2\'\"\$$\"/g" $< > .stx_goodies_metacello_core.svn.st; \
+	fi
+	$(MAKE) CC="$(CLASSLIB_CC)" OPT="$(OPT)" SEPINITCODE="$(SEPINITCODE)" STC="$(STC)" STFILE=.stx_goodies_metacello_core.svn $(C_RULE);
+	sed -i -e "s/\".stx_goodies_metacello_core.svn.st\");/\"\stx_goodies_metacello_core.st\");/g" .stx_goodies_metacello_core.svn.c
+	$(MAKE) .stx_goodies_metacello_core.svn.$(O)
+	@mv .stx_goodies_metacello_core.svn.$(O) stx_goodies_metacello_core.$(O)
+endif
+
+
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+ifneq (**NOHG**, $(shell hg root 2> /dev/null || echo -n '**NOHG**'))
+stx_goodies_metacello_core.$(O): $(shell hg root)/.hg/dirstate
+endif
+
+
+
+
+# run default testsuite for this package
+test: $(TOP)/goodies/builder/reports
+	$(MAKE) -C $(TOP)/goodies/builder/reports -f Makefile.init
+	$(TOP)/goodies/builder/reports/report-runner.sh -D . -r Builder::TestReport -p $(PACKAGE)
+
+
+
+# add more install actions here
+install::
+
+# add more install actions for aux-files (resources) here
+installAux::
+
+# add more preMake actions here
+preMake::
+
+# add more postMake actions here
+postMake:: cleanjunk
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+	cd ../../../libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd ../base && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+
+
+
+# build all packages containing referenced classes for this package
+# they are nor needed to compile the package
+references:
+
+
+cleanjunk::
+	-rm -f *.s *.s2
+
+clean::
+	-rm -f *.o *.H
+
+clobber:: clean
+	-rm -f *.so *.dll
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)MetacelloAbstractConstructor.$(O) MetacelloAbstractConstructor.$(H): MetacelloAbstractConstructor.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaseConfiguration.$(O) MetacelloBaseConfiguration.$(H): MetacelloBaseConfiguration.st $(INCLUDE_TOP)/stx/goodies/metacello/base/ConfigurationOf.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCannotUpdateReleasedVersionError.$(O) MetacelloCannotUpdateReleasedVersionError.$(H): MetacelloCannotUpdateReleasedVersionError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanNotification.$(O) MetacelloCleanNotification.$(H): MetacelloCleanNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloClearStackCacheNotification.$(O) MetacelloClearStackCacheNotification.$(H): MetacelloClearStackCacheNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloErrorInProjectConstructionNotification.$(O) MetacelloErrorInProjectConstructionNotification.$(H): MetacelloErrorInProjectConstructionNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSection.$(O) MetacelloMethodSection.$(H): MetacelloMethodSection.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSectionPath.$(O) MetacelloMethodSectionPath.$(H): MetacelloMethodSectionPath.st $(INCLUDE_TOP)/stx/libbasic/Array.$(H) $(INCLUDE_TOP)/stx/libbasic/ArrayedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSpec.$(O) MetacelloMethodSpec.$(H): MetacelloMethodSpec.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPackageSpecResolutionError.$(O) MetacelloPackageSpecResolutionError.$(H): MetacelloPackageSpecResolutionError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPlatform.$(O) MetacelloPlatform.$(H): MetacelloPlatform.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProject.$(O) MetacelloProject.$(H): MetacelloProject.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectRegistration.$(O) MetacelloProjectRegistration.$(H): MetacelloProjectRegistration.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectRegistry.$(O) MetacelloProjectRegistry.$(H): MetacelloProjectRegistry.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecForLoad.$(O) MetacelloProjectSpecForLoad.$(H): MetacelloProjectSpecForLoad.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecGenerator.$(O) MetacelloProjectSpecGenerator.$(H): MetacelloProjectSpecGenerator.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadError.$(O) MetacelloProjectSpecLoadError.$(H): MetacelloProjectSpecLoadError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptEngine.$(O) MetacelloScriptEngine.$(H): MetacelloScriptEngine.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptExecutor.$(O) MetacelloScriptExecutor.$(H): MetacelloScriptExecutor.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptGitHubDownloadNotification.$(O) MetacelloScriptGitHubDownloadNotification.$(H): MetacelloScriptGitHubDownloadNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptNotification.$(O) MetacelloScriptNotification.$(H): MetacelloScriptNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptingError.$(O) MetacelloScriptingError.$(H): MetacelloScriptingError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSemanticVersionNumber.$(O) MetacelloSemanticVersionNumber.$(H): MetacelloSemanticVersionNumber.st $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSkipDirtyPackageLoad.$(O) MetacelloSkipDirtyPackageLoad.$(H): MetacelloSkipDirtyPackageLoad.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSpec.$(O) MetacelloSpec.$(H): MetacelloSpec.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSpecLoader.$(O) MetacelloSpecLoader.$(H): MetacelloSpecLoader.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStackCacheNotification.$(O) MetacelloStackCacheNotification.$(H): MetacelloStackCacheNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationFailure.$(O) MetacelloValidationFailure.$(H): MetacelloValidationFailure.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationIssue.$(O) MetacelloValidationIssue.$(H): MetacelloValidationIssue.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationNotification.$(O) MetacelloValidationNotification.$(H): MetacelloValidationNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersion.$(O) MetacelloVersion.$(H): MetacelloVersion.st $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionDoesNotExistError.$(O) MetacelloVersionDoesNotExistError.$(H): MetacelloVersionDoesNotExistError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionNumber.$(O) MetacelloVersionNumber.$(H): MetacelloVersionNumber.st $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_core.$(O) stx_goodies_metacello_core.$(H): stx_goodies_metacello_core.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAbstractPackageSpec.$(O) MetacelloAbstractPackageSpec.$(H): MetacelloAbstractPackageSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAbstractVersionConstructor.$(O) MetacelloAbstractVersionConstructor.$(H): MetacelloAbstractVersionConstructor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaselineSpecGenerator.$(O) MetacelloBaselineSpecGenerator.$(H): MetacelloBaselineSpecGenerator.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloProjectSpecGenerator.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanLoadAndTestsNotification.$(O) MetacelloCleanLoadAndTestsNotification.$(H): MetacelloCleanLoadAndTestsNotification.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloCleanNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanLoadNotification.$(O) MetacelloCleanLoadNotification.$(H): MetacelloCleanLoadNotification.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloCleanNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloConfigurationSpecGenerator.$(O) MetacelloConfigurationSpecGenerator.$(H): MetacelloConfigurationSpecGenerator.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloProjectSpecGenerator.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloConflictingProjectError.$(O) MetacelloConflictingProjectError.$(H): MetacelloConflictingProjectError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptingError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLockedProjectError.$(O) MetacelloLockedProjectError.$(H): MetacelloLockedProjectError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptingError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMemberListSpec.$(O) MetacelloMemberListSpec.$(H): MetacelloMemberListSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMemberSpec.$(O) MetacelloMemberSpec.$(H): MetacelloMemberSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpec.$(O) MetacelloProjectSpec.$(H): MetacelloProjectSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadConflict.$(O) MetacelloProjectSpecLoadConflict.$(H): MetacelloProjectSpecLoadConflict.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloProjectSpecLoadError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloResolveProjectUpgrade.$(O) MetacelloResolveProjectUpgrade.$(H): MetacelloResolveProjectUpgrade.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptApiExecutor.$(O) MetacelloScriptApiExecutor.$(H): MetacelloScriptApiExecutor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptEnsureProjectLoadedForDevelopment.$(O) MetacelloScriptEnsureProjectLoadedForDevelopment.$(H): MetacelloScriptEnsureProjectLoadedForDevelopment.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptImageExecutor.$(O) MetacelloScriptImageExecutor.$(H): MetacelloScriptImageExecutor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptProjectSpecNotification.$(O) MetacelloScriptProjectSpecNotification.$(H): MetacelloScriptProjectSpecNotification.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptRegistryExecutor.$(O) MetacelloScriptRegistryExecutor.$(H): MetacelloScriptRegistryExecutor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionDoesNotExistError.$(O) MetacelloSymbolicVersionDoesNotExistError.$(H): MetacelloSymbolicVersionDoesNotExistError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionMethodSpec.$(O) MetacelloSymbolicVersionMethodSpec.$(H): MetacelloSymbolicVersionMethodSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMethodSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionSpec.$(O) MetacelloSymbolicVersionSpec.$(H): MetacelloSymbolicVersionSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMethodSection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloUseUpgradeError.$(O) MetacelloUseUpgradeError.$(H): MetacelloUseUpgradeError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptingError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationCriticalWarning.$(O) MetacelloValidationCriticalWarning.$(H): MetacelloValidationCriticalWarning.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloValidationIssue.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationError.$(O) MetacelloValidationError.$(H): MetacelloValidationError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloValidationIssue.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationWarning.$(O) MetacelloValidationWarning.$(H): MetacelloValidationWarning.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloValidationIssue.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValueHolderSpec.$(O) MetacelloValueHolderSpec.$(H): MetacelloValueHolderSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionDefinitionError.$(O) MetacelloVersionDefinitionError.$(H): MetacelloVersionDefinitionError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionMethodSection.$(O) MetacelloVersionMethodSection.$(H): MetacelloVersionMethodSection.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMethodSection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionMethodSpec.$(O) MetacelloVersionMethodSpec.$(H): MetacelloVersionMethodSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMethodSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionSpec.$(O) MetacelloVersionSpec.$(H): MetacelloVersionSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionValidator.$(O) MetacelloVersionValidator.$(H): MetacelloVersionValidator.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAddMemberSpec.$(O) MetacelloAddMemberSpec.$(H): MetacelloAddMemberSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowConflictingProjectUpgrade.$(O) MetacelloAllowConflictingProjectUpgrade.$(H): MetacelloAllowConflictingProjectUpgrade.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowProjectDowngrade.$(O) MetacelloAllowProjectDowngrade.$(H): MetacelloAllowProjectDowngrade.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowProjectUpgrade.$(O) MetacelloAllowProjectUpgrade.$(H): MetacelloAllowProjectUpgrade.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaselineConstructor.$(O) MetacelloBaselineConstructor.$(H): MetacelloBaselineConstructor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCopyMemberSpec.$(O) MetacelloCopyMemberSpec.$(H): MetacelloCopyMemberSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloGenericProjectSpec.$(O) MetacelloGenericProjectSpec.$(H): MetacelloGenericProjectSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloProjectSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloGroupSpec.$(O) MetacelloGroupSpec.$(H): MetacelloGroupSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupBaselineSpecForEnsureLoad.$(O) MetacelloLookupBaselineSpecForEnsureLoad.$(H): MetacelloLookupBaselineSpecForEnsureLoad.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupProjectSpec.$(O) MetacelloLookupProjectSpec.$(H): MetacelloLookupProjectSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupProjectSpecForLoad.$(O) MetacelloLookupProjectSpecForLoad.$(H): MetacelloLookupProjectSpecForLoad.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMergeMemberSpec.$(O) MetacelloMergeMemberSpec.$(H): MetacelloMergeMemberSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPackagesSpec.$(O) MetacelloPackagesSpec.$(H): MetacelloPackagesSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberListSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectReferenceSpec.$(O) MetacelloProjectReferenceSpec.$(H): MetacelloProjectReferenceSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadedNotification.$(O) MetacelloProjectSpecLoadedNotification.$(H): MetacelloProjectSpecLoadedNotification.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloRemoveMemberSpec.$(O) MetacelloRemoveMemberSpec.$(H): MetacelloRemoveMemberSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionNotDefinedError.$(O) MetacelloSymbolicVersionNotDefinedError.$(H): MetacelloSymbolicVersionNotDefinedError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSymbolicVersionDoesNotExistError.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloToolBoxConstructor.$(O) MetacelloToolBoxConstructor.$(H): MetacelloToolBoxConstructor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionConstructor.$(O) MetacelloVersionConstructor.$(H): MetacelloVersionConstructor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)/stx/libbasic/AbstractTime.$(H) $(INCLUDE_TOP)/stx/libbasic/ArithmeticValue.$(H) $(INCLUDE_TOP)/stx/libbasic/ArrayedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/Block.$(H) $(INCLUDE_TOP)/stx/libbasic/CharacterArray.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/CompiledCode.$(H) $(INCLUDE_TOP)/stx/libbasic/ExecutableFunction.$(H) $(INCLUDE_TOP)/stx/libbasic/Integer.$(H) $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Number.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/String.$(H) $(INCLUDE_TOP)/stx/libbasic/Symbol.$(H) $(INCLUDE_TOP)/stx/libbasic/Timestamp.$(H) $(INCLUDE_TOP)/stx/libbasic/UndefinedObject.$(H) $(INCLUDE_TOP)/stx/libbasic/UninterpretedBytes.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/Make.spec	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,229 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_core.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# This file contains specifications which are common to all platforms.
+#
+
+# Do NOT CHANGE THESE DEFINITIONS
+# (otherwise, ST/X will have a hard time to find out the packages location from its packageID,
+#  to find the source code of a class and to find the library for a package)
+MODULE=stx
+MODULE_DIR=goodies/metacello/core
+PACKAGE=$(MODULE):$(MODULE_DIR)
+
+
+# Argument(s) to the stc compiler (stc --usage).
+#  -headerDir=. : create header files locally
+#                (if removed, they will be created as common
+#  -Pxxx       : defines the package
+#  -Zxxx       : a prefix for variables within the classLib
+#  -Dxxx       : defines passed to to CC for inline C-code
+#  -Ixxx       : include path passed to CC for inline C-code
+#  +optspace   : optimized for space
+#  +optspace2  : optimized more for space
+#  +optspace3  : optimized even more for space
+#  +optinline  : generate inline code for some ST constructs
+#  +inlineNew  : additionally inline new
+#  +inlineMath : additionally inline some floatPnt math stuff
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCLOCALOPTIMIZATIONS=+optinline +inlineNew
+# STCLOCALOPTIMIZATIONS=+optspace3
+STCLOCALOPTIMIZATIONS=+optspace3
+
+
+# Argument(s) to the stc compiler (stc --usage).
+#  -warn            : no warnings
+#  -warnNonStandard : no warnings about ST/X extensions
+#  -warnEOLComments : no warnings about EOL comment extension
+#  -warnPrivacy     : no warnings about privateClass extension
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCWARNINGS=-warn
+# STCWARNINGS=-warnNonStandard
+# STCWARNINGS=-warnEOLComments
+STCWARNINGS=-warnNonStandard
+
+COMMON_CLASSES= \
+	MetacelloAbstractConstructor \
+	MetacelloBaseConfiguration \
+	MetacelloCannotUpdateReleasedVersionError \
+	MetacelloCleanNotification \
+	MetacelloClearStackCacheNotification \
+	MetacelloErrorInProjectConstructionNotification \
+	MetacelloMethodSection \
+	MetacelloMethodSectionPath \
+	MetacelloMethodSpec \
+	MetacelloPackageSpecResolutionError \
+	MetacelloPlatform \
+	MetacelloProject \
+	MetacelloProjectRegistration \
+	MetacelloProjectRegistry \
+	MetacelloProjectSpecForLoad \
+	MetacelloProjectSpecGenerator \
+	MetacelloProjectSpecLoadError \
+	MetacelloScriptEngine \
+	MetacelloScriptExecutor \
+	MetacelloScriptGitHubDownloadNotification \
+	MetacelloScriptNotification \
+	MetacelloScriptingError \
+	MetacelloSemanticVersionNumber \
+	MetacelloSkipDirtyPackageLoad \
+	MetacelloSpec \
+	MetacelloSpecLoader \
+	MetacelloStackCacheNotification \
+	MetacelloValidationFailure \
+	MetacelloValidationIssue \
+	MetacelloValidationNotification \
+	MetacelloVersion \
+	MetacelloVersionDoesNotExistError \
+	MetacelloVersionNumber \
+	stx_goodies_metacello_core \
+	MetacelloAbstractPackageSpec \
+	MetacelloAbstractVersionConstructor \
+	MetacelloBaselineSpecGenerator \
+	MetacelloCleanLoadAndTestsNotification \
+	MetacelloCleanLoadNotification \
+	MetacelloConfigurationSpecGenerator \
+	MetacelloConflictingProjectError \
+	MetacelloLockedProjectError \
+	MetacelloMemberListSpec \
+	MetacelloMemberSpec \
+	MetacelloProjectSpec \
+	MetacelloProjectSpecLoadConflict \
+	MetacelloResolveProjectUpgrade \
+	MetacelloScriptApiExecutor \
+	MetacelloScriptEnsureProjectLoadedForDevelopment \
+	MetacelloScriptImageExecutor \
+	MetacelloScriptProjectSpecNotification \
+	MetacelloScriptRegistryExecutor \
+	MetacelloSymbolicVersionDoesNotExistError \
+	MetacelloSymbolicVersionMethodSpec \
+	MetacelloSymbolicVersionSpec \
+	MetacelloUseUpgradeError \
+	MetacelloValidationCriticalWarning \
+	MetacelloValidationError \
+	MetacelloValidationWarning \
+	MetacelloValueHolderSpec \
+	MetacelloVersionDefinitionError \
+	MetacelloVersionMethodSection \
+	MetacelloVersionMethodSpec \
+	MetacelloVersionSpec \
+	MetacelloVersionValidator \
+	MetacelloAddMemberSpec \
+	MetacelloAllowConflictingProjectUpgrade \
+	MetacelloAllowProjectDowngrade \
+	MetacelloAllowProjectUpgrade \
+	MetacelloBaselineConstructor \
+	MetacelloCopyMemberSpec \
+	MetacelloGenericProjectSpec \
+	MetacelloGroupSpec \
+	MetacelloLookupBaselineSpecForEnsureLoad \
+	MetacelloLookupProjectSpec \
+	MetacelloLookupProjectSpecForLoad \
+	MetacelloMergeMemberSpec \
+	MetacelloPackagesSpec \
+	MetacelloProjectReferenceSpec \
+	MetacelloProjectSpecLoadedNotification \
+	MetacelloRemoveMemberSpec \
+	MetacelloSymbolicVersionNotDefinedError \
+	MetacelloToolBoxConstructor \
+	MetacelloVersionConstructor \
+
+
+
+
+COMMON_OBJS= \
+    $(OUTDIR_SLASH)MetacelloAbstractConstructor.$(O) \
+    $(OUTDIR_SLASH)MetacelloBaseConfiguration.$(O) \
+    $(OUTDIR_SLASH)MetacelloCannotUpdateReleasedVersionError.$(O) \
+    $(OUTDIR_SLASH)MetacelloCleanNotification.$(O) \
+    $(OUTDIR_SLASH)MetacelloClearStackCacheNotification.$(O) \
+    $(OUTDIR_SLASH)MetacelloErrorInProjectConstructionNotification.$(O) \
+    $(OUTDIR_SLASH)MetacelloMethodSection.$(O) \
+    $(OUTDIR_SLASH)MetacelloMethodSectionPath.$(O) \
+    $(OUTDIR_SLASH)MetacelloMethodSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloPackageSpecResolutionError.$(O) \
+    $(OUTDIR_SLASH)MetacelloPlatform.$(O) \
+    $(OUTDIR_SLASH)MetacelloProject.$(O) \
+    $(OUTDIR_SLASH)MetacelloProjectRegistration.$(O) \
+    $(OUTDIR_SLASH)MetacelloProjectRegistry.$(O) \
+    $(OUTDIR_SLASH)MetacelloProjectSpecForLoad.$(O) \
+    $(OUTDIR_SLASH)MetacelloProjectSpecGenerator.$(O) \
+    $(OUTDIR_SLASH)MetacelloProjectSpecLoadError.$(O) \
+    $(OUTDIR_SLASH)MetacelloScriptEngine.$(O) \
+    $(OUTDIR_SLASH)MetacelloScriptExecutor.$(O) \
+    $(OUTDIR_SLASH)MetacelloScriptGitHubDownloadNotification.$(O) \
+    $(OUTDIR_SLASH)MetacelloScriptNotification.$(O) \
+    $(OUTDIR_SLASH)MetacelloScriptingError.$(O) \
+    $(OUTDIR_SLASH)MetacelloSemanticVersionNumber.$(O) \
+    $(OUTDIR_SLASH)MetacelloSkipDirtyPackageLoad.$(O) \
+    $(OUTDIR_SLASH)MetacelloSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloSpecLoader.$(O) \
+    $(OUTDIR_SLASH)MetacelloStackCacheNotification.$(O) \
+    $(OUTDIR_SLASH)MetacelloValidationFailure.$(O) \
+    $(OUTDIR_SLASH)MetacelloValidationIssue.$(O) \
+    $(OUTDIR_SLASH)MetacelloValidationNotification.$(O) \
+    $(OUTDIR_SLASH)MetacelloVersion.$(O) \
+    $(OUTDIR_SLASH)MetacelloVersionDoesNotExistError.$(O) \
+    $(OUTDIR_SLASH)MetacelloVersionNumber.$(O) \
+    $(OUTDIR_SLASH)stx_goodies_metacello_core.$(O) \
+    $(OUTDIR_SLASH)MetacelloAbstractPackageSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloAbstractVersionConstructor.$(O) \
+    $(OUTDIR_SLASH)MetacelloBaselineSpecGenerator.$(O) \
+    $(OUTDIR_SLASH)MetacelloCleanLoadAndTestsNotification.$(O) \
+    $(OUTDIR_SLASH)MetacelloCleanLoadNotification.$(O) \
+    $(OUTDIR_SLASH)MetacelloConfigurationSpecGenerator.$(O) \
+    $(OUTDIR_SLASH)MetacelloConflictingProjectError.$(O) \
+    $(OUTDIR_SLASH)MetacelloLockedProjectError.$(O) \
+    $(OUTDIR_SLASH)MetacelloMemberListSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloMemberSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloProjectSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloProjectSpecLoadConflict.$(O) \
+    $(OUTDIR_SLASH)MetacelloResolveProjectUpgrade.$(O) \
+    $(OUTDIR_SLASH)MetacelloScriptApiExecutor.$(O) \
+    $(OUTDIR_SLASH)MetacelloScriptEnsureProjectLoadedForDevelopment.$(O) \
+    $(OUTDIR_SLASH)MetacelloScriptImageExecutor.$(O) \
+    $(OUTDIR_SLASH)MetacelloScriptProjectSpecNotification.$(O) \
+    $(OUTDIR_SLASH)MetacelloScriptRegistryExecutor.$(O) \
+    $(OUTDIR_SLASH)MetacelloSymbolicVersionDoesNotExistError.$(O) \
+    $(OUTDIR_SLASH)MetacelloSymbolicVersionMethodSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloSymbolicVersionSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloUseUpgradeError.$(O) \
+    $(OUTDIR_SLASH)MetacelloValidationCriticalWarning.$(O) \
+    $(OUTDIR_SLASH)MetacelloValidationError.$(O) \
+    $(OUTDIR_SLASH)MetacelloValidationWarning.$(O) \
+    $(OUTDIR_SLASH)MetacelloValueHolderSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloVersionDefinitionError.$(O) \
+    $(OUTDIR_SLASH)MetacelloVersionMethodSection.$(O) \
+    $(OUTDIR_SLASH)MetacelloVersionMethodSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloVersionSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloVersionValidator.$(O) \
+    $(OUTDIR_SLASH)MetacelloAddMemberSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloAllowConflictingProjectUpgrade.$(O) \
+    $(OUTDIR_SLASH)MetacelloAllowProjectDowngrade.$(O) \
+    $(OUTDIR_SLASH)MetacelloAllowProjectUpgrade.$(O) \
+    $(OUTDIR_SLASH)MetacelloBaselineConstructor.$(O) \
+    $(OUTDIR_SLASH)MetacelloCopyMemberSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloGenericProjectSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloGroupSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloLookupBaselineSpecForEnsureLoad.$(O) \
+    $(OUTDIR_SLASH)MetacelloLookupProjectSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloLookupProjectSpecForLoad.$(O) \
+    $(OUTDIR_SLASH)MetacelloMergeMemberSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloPackagesSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloProjectReferenceSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloProjectSpecLoadedNotification.$(O) \
+    $(OUTDIR_SLASH)MetacelloRemoveMemberSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloSymbolicVersionNotDefinedError.$(O) \
+    $(OUTDIR_SLASH)MetacelloToolBoxConstructor.$(O) \
+    $(OUTDIR_SLASH)MetacelloVersionConstructor.$(O) \
+    $(OUTDIR_SLASH)extensions.$(O) \
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/Makefile.init	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,27 @@
+#
+# DO NOT EDIT
+#
+# make uses this file (Makefile) only, if there is no
+# file named "makefile" (lower-case m) in the same directory.
+# My only task is to generate the real makefile and call make again.
+# Thereafter, I am no longer used and needed.
+#
+# MACOSX caveat:
+#   as filenames are not case sensitive (in a default setup),
+#   we cannot use the above trick. Therefore, this file is now named
+#   "Makefile.init", and you have to execute "make -f Makefile.init" to
+#   get the initial makefile.  This is now also done by the toplevel CONFIG
+#   script.
+
+.PHONY: run
+
+run: makefile
+	$(MAKE) -f makefile
+
+#only needed for the definition of $(TOP)
+include Make.proto
+
+makefile: mf
+
+mf:
+	$(TOP)/rules/stmkmf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAbstractConstructor.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,97 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloAbstractConstructor
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloAbstractConstructor methodsFor:'accessing'!
+
+configurationClass
+
+	^self subclassResponsibility
+! !
+
+!MetacelloAbstractConstructor methodsFor:'pragma extraction'!
+
+extractAllVersionPragmas
+
+	| aDict |
+	aDict := Dictionary new.
+	self extractPragmas: #version: into: aDict.
+	self extractPragmas: #version:imports: into: aDict.
+	^aDict
+!
+
+extractCommonDefaultSymbolicVersionPragmas
+
+	| aDict |
+	aDict := Dictionary new.
+	self extractPragmas: #defaultSymbolicVersion: for: ConfigurationOf into: aDict.
+	^aDict
+!
+
+extractDefaultSymbolicVersionPragmas
+
+	| aDict |
+	aDict := Dictionary new.
+	self extractPragmas: #defaultSymbolicVersion: into: aDict.
+	^aDict
+!
+
+extractSymbolicVersionPragmas
+
+	| aDict |
+	aDict := Dictionary new.
+	self extractPragmas: #symbolicVersion: into: aDict.
+	^aDict
+!
+
+extractVersionImportPragmas
+
+	| aDict |
+	aDict := Dictionary new.
+	self extractPragmas: #version:imports: into: aDict.
+	^aDict
+!
+
+extractVersionPragmas
+
+	| aDict |
+	aDict := Dictionary new.
+	self extractPragmas: #version: into: aDict.
+	^aDict
+! !
+
+!MetacelloAbstractConstructor methodsFor:'private'!
+
+extractPragmas: pragmaKeyword for: aClass into: versionDict
+
+	| versionString  pragmas |
+	(Pragma 
+		allNamed: pragmaKeyword
+		in: aClass) do: [:pragma |
+			versionString := pragma argumentAt: 1.
+			pragmas := versionDict 
+				at: versionString 
+				ifAbsent: [ | list |
+					list := OrderedCollection new.
+					versionDict at: versionString put: list.
+					list ].
+			pragmas add: pragma ].
+!
+
+extractPragmas: pragmaKeyword into: versionDict
+
+	^self extractPragmas: pragmaKeyword for: self configurationClass into: versionDict
+! !
+
+!MetacelloAbstractConstructor class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAbstractPackageSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,248 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloAbstractPackageSpec
+	instanceVariableNames:'name requires includes answers'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloAbstractPackageSpec methodsFor:'accessing'!
+
+answers: aListOfPairs
+
+	self setAnswers: aListOfPairs
+!
+
+includes: aCollection
+
+	aCollection setIncludesInMetacelloPackage: self
+!
+
+name: aString
+    ((aString at: 1) isSeparator or: [ (aString at: aString size) isSeparator ])
+        ifTrue: [ self error: 'Names are not allowed to have leading or trailing blanks: ' , aString printString ].
+    name := aString
+!
+
+referencedSpec
+
+	^self
+!
+
+requires: aCollection
+
+	aCollection setRequiresInMetacelloPackage: self
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'adding'!
+
+addToMetacelloPackages: aMetacelloPackagesSpec
+
+	aMetacelloPackagesSpec addMember: 
+		(aMetacelloPackagesSpec addMember 
+			name: self name;
+			spec: self;
+			yourself)
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'copying'!
+
+postCopy
+
+	super postCopy.
+	requires := requires copy.
+	includes := includes copy.
+	answers := answers copy.
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'merging'!
+
+mergeIntoMetacelloPackages: aMetacelloPackagesSpec
+
+	aMetacelloPackagesSpec addMember: 
+		(aMetacelloPackagesSpec mergeMember 
+			name: self name;
+			spec: self;
+			yourself)
+!
+
+mergeMap
+
+	| map |
+	map := super mergeMap.
+	map at: #requires put: requires.
+	map at: #includes put: includes.
+	map at: #answers put: answers.
+	^map
+!
+
+mergeSpec: anotherSpec
+
+	| newSpec map anotherRequires anotherIncludes anotherAnswers |
+	newSpec := super mergeSpec: anotherSpec.
+	map := anotherSpec mergeMap.
+	anotherSpec name ~~ nil 
+		ifTrue: [ newSpec name: anotherSpec name ].
+	(anotherRequires := map at: #requires) ~~ nil
+		ifTrue: [ newSpec setRequires: self requires, anotherRequires ].
+	(anotherIncludes := map at: #includes) ~~ nil
+		ifTrue: [ newSpec setIncludes: self includes, anotherIncludes ].
+	(anotherAnswers := map at: #answers) ~~ nil
+		ifTrue: [ newSpec setAnswers: self answers, anotherAnswers ].
+	^newSpec
+	
+!
+
+nonOverridable
+
+	^#( includes requires answers )
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'printing'!
+
+configMethodBodyOn: aStream hasName: hasName cascading: cascading indent: indent
+
+	| hasCascading hasRequires hasIncludes hasAnswers |
+	hasCascading := cascading.
+	hasRequires := self requires isEmpty not.
+	hasIncludes := self includes isEmpty not.
+	hasAnswers := self answers isEmpty not.
+	hasRequires
+		ifTrue: [ 
+			hasName | hasIncludes | hasAnswers | hasCascading
+				ifTrue: [ aStream cr; tab: indent ].
+			aStream nextPutAll: 'requires: #('.
+			self requires do: [:str | aStream nextPutAll: str printString, ' ' ].
+			hasIncludes | hasAnswers | hasCascading
+				ifTrue: [ aStream nextPutAll: ');' ]
+				ifFalse: [ aStream nextPut: $) ]].
+	hasIncludes
+		ifTrue: [ 
+			hasName | hasRequires | hasAnswers | hasCascading
+				ifTrue: [ aStream cr; tab: indent ].
+			aStream nextPutAll: 'includes: #('.
+			self includes do: [:str | aStream nextPutAll: str printString, ' ' ].
+			hasAnswers | hasCascading
+				ifTrue: [ aStream nextPutAll: ');' ]
+				ifFalse: [ aStream nextPut: $) ]].
+	hasAnswers
+		ifTrue: [ 
+			hasName | hasRequires | hasIncludes | hasCascading
+				ifTrue: [ aStream cr; tab: indent ].
+			aStream nextPutAll: 'supplyingAnswers: #( '.
+			self answers do: [:ar | 
+				aStream nextPutAll: '#( '.
+				ar do: [:val | 
+					(val isString or: [ val isNumber or: [ val isSymbol or: [ val isCharacter ]]])
+						ifTrue: [  aStream nextPutAll: val printString, ' ' ].
+					val == true
+						ifTrue: [  aStream nextPutAll: 'true ' ].
+					val == false
+						ifTrue: [  aStream nextPutAll: 'false ' ]].
+				aStream nextPutAll: ') ' ].
+			hasCascading
+				ifTrue: [ aStream nextPutAll: ');' ]
+				ifFalse: [ aStream nextPut: $) ]].
+!
+
+configMethodCascadeOn: aStream member: aMember last: lastCascade indent: indent
+
+	self subclassResponsibility
+!
+
+configMethodOn: aStream for: aValue selector: selector cascading: cascading cascade: cascade indent: indent
+
+	| valuePrintString |
+	aValue == nil ifTrue: [ ^self ].
+	cascading ifTrue: [ aStream cr; tab: indent ].
+	valuePrintString := aValue value isSymbol
+		ifTrue: [ '#' , aValue value asString printString ]
+		ifFalse: [ aValue value printString ].
+	aStream  nextPutAll: selector, valuePrintString.
+	cascade ifTrue: [ aStream nextPut: $; ]
+!
+
+label
+
+	^self name
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'private'!
+
+includesForPackageOrdering
+
+	^#()
+!
+
+setAnswers: aCollection
+
+	answers := aCollection
+!
+
+setIncludes: aCollection
+
+	includes := aCollection
+!
+
+setRequires: aCollection
+
+	requires := aCollection
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'querying'!
+
+answers
+
+	answers == nil ifTrue: [ answers := #() ].
+	^answers
+!
+
+includes
+
+	includes == nil ifTrue: [ includes := #() ].
+	^includes
+!
+
+name
+
+	^name
+!
+
+requires
+
+	requires == nil ifTrue: [ requires := #() ].
+	^requires
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'removing'!
+
+removeFromMetacelloPackages: aMetacelloPackagesSpec
+
+	aMetacelloPackagesSpec addMember: 
+		(aMetacelloPackagesSpec removeMember 
+			name: self name;
+			spec: self;
+			yourself)
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'testing'!
+
+hasRepository
+    ^ false
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'visiting'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+
+	self subclassResponsibility
+! !
+
+!MetacelloAbstractPackageSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAbstractVersionConstructor.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,828 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractConstructor subclass:#MetacelloAbstractVersionConstructor
+	instanceVariableNames:'root configuration project attributeMap attributeOrder
+		symbolicVersion currentContext'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloAbstractVersionConstructor class methodsFor:'method generation'!
+
+symbolicMethodSelectorAndPragma: selector symbolicVersionSymbol: symbolicVersionSymbol on: strm
+	strm
+		nextPutAll: selector asString , ' spec';
+		cr;
+		tab;
+		nextPutAll: '<symbolicVersion: #' , symbolicVersionSymbol asString printString;
+		nextPutAll: '>';
+		cr
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'accessing'!
+
+addAttribute: anAttribute
+
+	self attributeOrder add: anAttribute
+!
+
+attributeMap
+
+	attributeMap == nil ifTrue: [ attributeMap := Dictionary new ].
+	^attributeMap
+!
+
+attributeOrder
+
+	attributeOrder == nil ifTrue: [ attributeOrder := OrderedCollection new ].
+	^attributeOrder
+!
+
+configuration
+
+	^configuration
+!
+
+configuration: aConfig
+
+	configuration := aConfig
+!
+
+configurationClass
+
+	^self configuration class
+!
+
+project
+    ^project
+
+    "Created: / 18-09-2012 / 19:08:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+root
+
+	^root
+!
+
+root: aMetacelloSpec
+    root := aMetacelloSpec
+!
+
+setProject: aProject
+
+	project := aProject
+!
+
+symbolicVersion
+
+	^symbolicVersion
+!
+
+symbolicVersion: aSymbol
+
+	symbolicVersion := aSymbol
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'api'!
+
+author: aBlockOrString
+    "Define author field of version spec (MetacelloMCVersionSpec).
+	 If <aBlockOrString> is a String, the version spec author is set to the String.
+	If <aBlockOrString> is a Block, the specifications in <aBlockOrString> are applied to the author spec (MetacelloValueHolderSpec). Not Recommended!!
+	
+		spec author: 'dkh'.
+		
+		spec author: [
+			spec value: 'dkh'. ].
+	 "
+
+    self root author: aBlockOrString constructor: self
+!
+
+baseline: aString
+    self root baseline: aString constructor: self
+!
+
+baseline: aString with: aBlockOrString
+    self root baseline: aString with: aBlockOrString constructor: self
+!
+
+blessing: aBlockOrString
+    "Define blessing field of version spec (MetacelloMCVersionSpec).
+	 If <aBlockOrString> is a String, the version spec blessing is set to the String. It is recommended to use a Symbol.
+	If <aBlockOrString> is a Block, the specifications in <aBlockOrString> are applied to the blessing spec (MetacelloValueHolderSpec). Not Recommended!!
+	
+		spec blessing: #release.
+		
+		spec blessing: [
+			spec value: #release. ].
+	
+	The blessing should typically be set to one of three values:
+		#baseline - indicating that the version spec is specifying a baseline version
+		#development - indicating that the version spec is not stabilized and will change over time
+		#release - indicating that the version spec has stabilized and will NOT change over time
+	 "
+
+    self root blessing: aBlockOrString constructor: self
+!
+
+className: aString
+    "Define className field of a project spec (MetacelloMCProjectSpec).
+	
+		spec project: 'CoolBrowser' with: [
+			spec className: 'ConfigurationOfCoolBrowser'. ].
+
+	The className field is OPTIONAL in the project spec. If omitted, the className will be created by prepending 'ConfigurationOf' to the project name.
+	 "
+
+    self root className: aString constructor: self
+!
+
+configuration: aString with: aBlockOrString
+    self root configuration: aString with: aBlockOrString constructor: self
+!
+
+description: aBlockOrString
+    "Define description field of version spec (MetacelloMCVersionSpec).
+	 If <aBlockOrString> is a String, the version spec blessing is set to the String. It is recommended to use a Symbol.
+	If <aBlockOrString> is a Block, the specifications in <aBlockOrString> are applied to the blessing spec (MetacelloValueHolderSpec). Not Recommended!!
+	
+		spec description: 'Descriptive comment'.
+		
+		spec description: [
+			spec value: 'Descriptive comment'.
+	 "
+
+    self root description: aBlockOrString constructor: self
+!
+
+file: aString
+    "Define file field of a package spec (MetacelloPackageSpec) or project spec (MetacelloMCProjectSpec).
+
+	For a package spec, the file: field is optional in a baseline. In a baseline, the file field may be used to specify a package branch for the package:
+	
+		spec package: 'MyPackage' with: [
+			spec file: 'MyPackage.gemstone'. ]'.
+
+	The file: field is required in a version. In a version, the file field defines the explicit version of the package to be loaded:
+	
+		spec package: 'MyPackage' with: [
+			spec file: 'MyPackage.gemstone-dkh.1'. ]'.
+
+	The following may be used as a short cut for specifying the file field in a version:
+
+		spec package: 'MyPackage' with: 'MyPackage.gemstone-dkh.1'.
+
+	For a project spec, the file field specifies the name of the Monticello package that contains the configuration. If you are using the convention of 
+	naming the class and package usingthe  'ConfigurationOf' prefix, then there is no need to specify the file field:
+	
+		spec project: 'MyProject' with: [
+			spec file: 'ConfigurationMyProject'.
+
+	It should only be used when the package name for the configuration is different from the name of the project:
+
+		spec project: 'MyProject' with: [
+			spec file: 'MyProject-Metacello'.
+	 "
+
+    self root file: aString constructor: self
+!
+
+for: attribute do: aBlock
+	"conditional version support"
+
+	| blockList |
+	blockList := self attributeMap
+		at: attribute
+		ifAbsent: [ self attributeMap at: attribute put: (blockList := OrderedCollection new) ].
+	blockList add: aBlock.
+	self addAttribute: attribute
+!
+
+for: attribute version: aString
+	"conditional symbolicVersion support"
+
+	self attributeMap at: attribute put: aString.
+	self addAttribute: attribute
+!
+
+group: aString overrides: aStringOrCollection
+    self root group: aString overrides: aStringOrCollection constructor: self
+!
+
+group: aString with: aStringOrCollection
+    self root group: aString with: aStringOrCollection constructor: self
+!
+
+import: aString
+    "import names defined in baseline <aString> to be used when loading the version
+
+		spec baseline: 'Sample' with: [ spec repository: 'github://dalehenrich/sample:master/repository' ].
+		spec import: 'Sample' ]
+	 "
+
+    self root import: aString constructor: self
+!
+
+includes: anObject
+    self root includes: anObject constructor: self
+!
+
+loads: anObject
+    self root loads: anObject constructor: self
+!
+
+name: anObject
+    self root name: anObject constructor: self
+!
+
+operator: anObject
+    self root operator: anObject constructor: self
+!
+
+package: aString
+    self root package: aString constructor: self
+!
+
+package: aString overrides: aBlock
+    self root package: aString overrides: aBlock constructor: self
+!
+
+package: packageName with: aBlockOrString
+    "Define specification for package <packageName>.
+	 If <aBlockOrString> is a String (or Symbol), the String is expected to be a version (or symbolic version).
+	If <aBlockOrString> is a Block, the specifications in <aBlockOrString> are applied to the project:
+	
+		spec package: 'MyPackage' with: '1.0'.
+		
+		spec package: 'MyPackage' with: [
+			spec file:'MyPackage-dkh.1'.
+			spec repository: '/opt/gemstone/repository'.
+	 "
+
+    self root package: packageName with: aBlockOrString constructor: self
+!
+
+postLoadDoIt: aSymbol
+    self root postLoadDoIt: aSymbol constructor: self
+!
+
+preLoadDoIt: aSymbol
+    self root preLoadDoIt: aSymbol constructor: self
+!
+
+project: aString
+    self root project: aString constructor: self
+!
+
+project: aString copyFrom: oldSpecName with: aBlock
+    self root
+        project: aString
+        copyFrom: oldSpecName
+        with: aBlock
+        constructor: self
+!
+
+project: aString overrides: aBlock
+    self root project: aString overrides: aBlock constructor: self
+!
+
+project: aString with: aBlockOrString
+    self root project: aString with: aBlockOrString constructor: self
+!
+
+projectPackage: aBlock
+    "projectPackage spec data folded into project spec"
+
+    self root projectPackage: aBlock constructor: self
+!
+
+removeGroup: aString
+    self root removeGroup: aString constructor: self
+!
+
+removePackage: aString
+    self root removePackage: aString constructor: self
+!
+
+removeProject: aString
+    self root removeProject: aString constructor: self
+!
+
+repositories: aBlock
+    self root repositories: aBlock constructor: self
+!
+
+repository: anObject
+    self root repository: anObject constructor: self
+!
+
+repository: description username: username password: password
+    self root
+        repository: description
+        username: username
+        password: password
+        constructor: self
+!
+
+requires: anObject
+    self root requires: anObject constructor: self
+!
+
+supplyingAnswers: aCollection
+    self root supplyingAnswers: aCollection constructor: self
+!
+
+timestamp: aBlockOrStringOrDateAndTime
+    "Define timestamp field of version spec (MetacelloMCVersionSpec).
+	 If <aBlockOrStringOrDateAndTime> is a String, the version spec timetamp is set to the String.
+	 If <aBlockOrStringOrDateAndTime> is a DateAndTime, the version spec timetamp is set to the printString of the DateAndTime.
+	If <aBlockOrStringOrDateAndTime> is a Block, the specifications in <aBlockOrStringOrDateAndTime> are applied to the timestamp spec (MetacelloValueHolderSpec). Not Recommended!!
+	
+		spec timestamp: '10/7/2009 14:40'.
+		
+		spec timestamp: DateAndTime now'.
+		
+		spec timestamp: [
+			spec value: '10/7/2009 14:40'. ].
+    "
+
+    self root timestamp: aBlockOrStringOrDateAndTime constructor: self
+!
+
+value: anObject
+    self root value: anObject constructor: self
+!
+
+version: anObject
+    self root version: anObject constructor: self
+!
+
+versionString: anObject
+    self root versionString: anObject constructor: self
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'api callbacks'!
+
+setAuthorWithBlock: aBlock
+
+	| spec |
+	(spec := self root getAuthor) == nil
+		ifTrue: [ 
+			spec := self project valueHolderSpec.
+			self root setAuthor: spec ].
+	self with: spec during: aBlock
+!
+
+setAuthorWithString: aString
+
+	self root author: aString
+!
+
+setBaseline: aString
+    | spec projectSpec |
+    projectSpec := self project baselineOfProjectSpec
+        name: aString;
+        className: 'BaselineOf' , aString;
+        yourself.
+    spec := self project projectReferenceSpec
+        name: aString;
+        projectReference: projectSpec;
+        yourself.
+    self root packages merge: spec.
+    ^ projectSpec
+!
+
+setBaseline: aString withBlock: aBlock
+    | projectSpec |
+    projectSpec := self setBaseline: aString.
+    self with: projectSpec during: aBlock
+!
+
+setBlessingWithBlock: aBlock
+
+	| spec |
+	(spec := self root getBlessing) == nil
+		ifTrue: [ 
+			spec := self project valueHolderSpec.
+			self root setBlessing: spec ].
+	self with: spec during: aBlock
+!
+
+setBlessingWithString: aString
+
+	self root blessing: aString
+!
+
+setConfiguration: aString withBlock: aBlock
+    | spec projectSpec |
+    projectSpec := self project configurationOfProjectSpec
+        name: aString;
+        yourself.
+    spec := self project projectReferenceSpec
+        name: aString;
+        projectReference: projectSpec;
+        yourself.
+    self root packages merge: spec.
+    self with: projectSpec during: aBlock
+!
+
+setDescriptionWithBlock: aBlock
+
+	| spec |
+	(spec := self root getDescription) == nil
+		ifTrue: [ 
+			spec := self project valueHolderSpec.
+			self root setDescription: spec ].
+	self with: spec during: aBlock
+!
+
+setDescriptionWithString: aString
+
+	self root description: aString
+!
+
+setPackage: aString withBlock: aBlock
+
+	| spec |
+	spec := 
+		(self project packageSpec)
+			name: aString;
+			yourself.
+	self root packages merge: spec.
+	self with: spec during: aBlock
+!
+
+setPackage: aString withString: aFile
+
+	| spec |
+	spec := 
+		(self project packageSpec)
+			name: aString;
+			file: aFile;
+			yourself.
+	self root packages merge: spec.
+!
+
+setProject: aString withBlock: aBlock
+    | spec projectSpec |
+    projectSpec := self project projectSpec
+        name: aString;
+        yourself.
+    spec := self project projectReferenceSpec
+        name: aString;
+        projectReference: projectSpec;
+        yourself.
+    self root packages merge: spec.
+    self with: projectSpec during: aBlock
+!
+
+setProject: aString withString: versionString
+
+	| spec projectSpec |
+	projectSpec := 
+		(self project projectSpec)
+			name: aString;
+			versionString: versionString;
+			yourself.
+	spec := 
+		(self project projectReferenceSpec)
+			name: aString;
+			projectReference: projectSpec;
+			yourself.
+	self root packages merge: spec.
+!
+
+setTimestampWithBlock: aBlock
+
+	| spec |
+	(spec := self root getTimestamp) == nil
+		ifTrue: [ 
+			spec := self project valueHolderSpec.
+			self root setTimestamp: spec ].
+	self with: spec during: aBlock
+!
+
+setTimestampWithString: aString
+
+	self root timestamp: aString
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'api spec callbacks'!
+
+authorForVersion: aBlockOrString
+    aBlockOrString setAuthorInMetacelloConfig: self
+!
+
+baselineForVersion: aString
+    self setBaseline: aString
+!
+
+baselineForVersion: aString with: aBlock
+    aBlock setBaseline: aString withInMetacelloConfig: self
+!
+
+blessingForVersion: aBlockOrString
+    aBlockOrString setBlessingInMetacelloConfig: self
+!
+
+classNameForProject: aString
+    self root className: aString
+!
+
+configurationForVersion: aString with: aBlock
+    aBlock setConfiguration: aString withInMetacelloConfig: self
+!
+
+descriptionForVersion: aBlockOrString
+    aBlockOrString setDescriptionInMetacelloConfig: self
+!
+
+fileForPackage: aString
+    self root file: aString
+!
+
+fileForProject: aString
+    self root file: aString
+!
+
+groupForVersion: aString overrides: aStringOrCollection
+    | spec |
+    spec := self project groupSpec
+        name: aString;
+        includes: aStringOrCollection;
+        yourself.
+    self root packages add: spec
+!
+
+groupForVersion: aString with: aStringOrCollection
+    | spec |
+    spec := self project groupSpec
+        name: aString;
+        includes: aStringOrCollection;
+        yourself.
+    self root packages merge: spec
+!
+
+importForVersion: aString
+    self root import: aString
+!
+
+includesForPackage: anObject
+    self root includes: anObject
+!
+
+loadsForProject: anObject
+    self root loads: anObject
+!
+
+nameForProject: aString
+    self root name: aString
+!
+
+operatorForProject: anObject
+    self root operator: anObject
+!
+
+packageForVersion: aString
+    | spec |
+    spec := self project packageSpec
+        name: aString;
+        yourself.
+    self root packages add: spec
+!
+
+packageForVersion: aString overrides: aBlock
+    | spec |
+    spec := self project packageSpec
+        name: aString;
+        yourself.
+    self root packages add: spec.
+    self with: spec during: aBlock
+!
+
+packageForVersion: packageName with: aBlockOrString
+    aBlockOrString setPackage: packageName withInMetacelloConfig: self
+!
+
+postLoadDoItForPackage: aSymbol
+    self postLoadDoItForSpec: aSymbol
+!
+
+postLoadDoItForProject: aSymbol
+    self postLoadDoItForSpec: aSymbol
+!
+
+postLoadDoItForSpec: aSymbol
+    self validateDoItSelector: aSymbol.
+    self root postLoadDoIt: aSymbol
+!
+
+postLoadDoItForVersion: aSymbol
+    self postLoadDoItForSpec: aSymbol
+!
+
+preLoadDoItForPackage: aSymbol
+    self preLoadDoItForSpec: aSymbol
+!
+
+preLoadDoItForProject: aSymbol
+    self preLoadDoItForSpec: aSymbol
+!
+
+preLoadDoItForSpec: aSymbol
+    self validateDoItSelector: aSymbol.
+    self root preLoadDoIt: aSymbol
+!
+
+preLoadDoItForVersion: aSymbol
+    self preLoadDoItForSpec: aSymbol
+!
+
+projectForVersion: aString
+    self project: aString with: ''
+!
+
+projectForVersion: aString copyFrom: oldSpecName with: aBlock
+    | spec projectSpec |
+    projectSpec := self project projectSpec
+        name: aString;
+        yourself.
+    spec := self project projectReferenceSpec
+        name: aString;
+        projectReference: projectSpec;
+        yourself.
+    self root packages copy: oldSpecName to: spec.
+    self with: projectSpec during: aBlock
+!
+
+projectForVersion: aString overrides: aBlock
+    | spec projectSpec |
+    projectSpec := self project projectSpec
+        name: aString;
+        yourself.
+    spec := self project projectReferenceSpec
+        name: aString;
+        projectReference: projectSpec;
+        yourself.
+    self root packages add: spec.
+    self with: projectSpec during: aBlock
+!
+
+projectForVersion: aString with: aBlockOrString
+    aBlockOrString setProject: aString withInMetacelloConfig: self
+!
+
+projectPackageForProject: aBlock
+    self with: self root during: aBlock
+!
+
+removeGroupForVersion: aString
+    | spec |
+    spec := self project groupSpec
+        name: aString;
+        yourself.
+    self root packages remove: spec
+!
+
+removePackageForVersion: aString
+    | spec |
+    spec := self project packageSpec
+        name: aString;
+        yourself.
+    self root packages remove: spec
+!
+
+removeProjectForVersion: aString
+    | spec |
+    spec := self project projectReferenceSpec
+        name: aString;
+        yourself.
+    self root packages remove: spec
+!
+
+repositoriesForPackage: aBlock
+    self repositoriesForSpec: aBlock
+!
+
+repositoriesForProject: aBlock
+    self repositoriesForSpec: aBlock
+!
+
+repositoriesForSpec: aBlock
+    self with: self root repositories during: aBlock
+!
+
+repositoriesForVersion: aBlock
+    self repositoriesForSpec: aBlock
+!
+
+repositoryForPackage: anObject
+    self repositoryForSpec: anObject
+!
+
+repositoryForPackage: aString username: username password: password
+    self repositoryForSpec: aString username: username password: password
+!
+
+repositoryForProject: anObject
+    self repositoryForSpec: anObject
+!
+
+repositoryForProject: aString username: username password: password
+    self repositoryForSpec: aString username: username password: password
+!
+
+repositoryForRepositories: anObject
+    self repositoryForSpec: anObject
+!
+
+repositoryForRepositories: aString username: username password: password
+    self repositoryForVersion: aString username: username password: password
+!
+
+repositoryForSpec: anObject
+    self root repository: anObject
+!
+
+repositoryForSpec: aString username: username password: password
+    self root repository: aString username: username password: password
+!
+
+repositoryForVersion: anObject
+    self repositoryForSpec: anObject
+!
+
+repositoryForVersion: aString username: username password: password
+    self repositoryForSpec: aString username: username password: password
+!
+
+requiresForPackage: anObject
+    self root requires: anObject
+!
+
+supplyingAnswersForPackage: anObject
+    self root answers: anObject
+!
+
+timestampForVersion: aBlockOrStringOrDateAndTime
+    aBlockOrStringOrDateAndTime setTimestampInMetacelloConfig: self
+!
+
+valueForValueHolder: anObject
+    self root value: anObject
+!
+
+versionForProject: anObject
+    self versionStringForProject: anObject
+!
+
+versionForVersion: anObject
+    self versionStringForVersion: anObject
+!
+
+versionStringForProject: anObject
+    self root versionString: anObject
+!
+
+versionStringForVersion: anObject
+    self versionStringForProject: anObject
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'initialization'!
+
+reset
+    attributeMap := attributeOrder := nil
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'private'!
+
+evaluatePragma: pragma
+	currentContext := pragma.
+	[ self configuration perform: pragma selector with: self ] ensure: [ currentContext := nil ]
+!
+
+with: aMetacelloSpec during: aBlock
+    | previousRoot |
+    previousRoot := self root.
+    self root: aMetacelloSpec.
+    aBlock
+        ensure: [ self root: previousRoot ]
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'validation'!
+
+validateDoItSelector: anObject
+
+	anObject == nil ifTrue: [ ^ self ].
+	anObject isSymbol ifFalse: [ self error: 'Invalid message selector for doit: ', anObject printString ].
+! !
+
+!MetacelloAbstractVersionConstructor class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAddMemberSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,35 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMemberSpec subclass:#MetacelloAddMemberSpec
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Members'
+!
+
+
+!MetacelloAddMemberSpec methodsFor:'accessing'!
+
+methodUpdateSelector
+
+	^#overrides:
+! !
+
+!MetacelloAddMemberSpec methodsFor:'actions'!
+
+applyAdd: addBlock copy: copyBlock merge: mergeBlock remove: removeBlock
+
+	addBlock value: self
+!
+
+applyToList: aListSpec
+
+	aListSpec add: self
+! !
+
+!MetacelloAddMemberSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAllowConflictingProjectUpgrade.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloResolveProjectUpgrade subclass:#MetacelloAllowConflictingProjectUpgrade
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloAllowConflictingProjectUpgrade methodsFor:'accessing'!
+
+operationString
+    ^ 'conflict'
+! !
+
+!MetacelloAllowConflictingProjectUpgrade methodsFor:'exception handling'!
+
+defaultAction
+    ^ MetacelloConflictingProjectError
+        signal:
+            'Load Conflict between existing ' , self existingProjectRegistration printString , ' and '
+                , self newProjectRegistration printString
+! !
+
+!MetacelloAllowConflictingProjectUpgrade methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+    ^ aScriptEngine handleConflict: self
+! !
+
+!MetacelloAllowConflictingProjectUpgrade class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAllowProjectDowngrade.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,32 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloResolveProjectUpgrade subclass:#MetacelloAllowProjectDowngrade
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloAllowProjectDowngrade methodsFor:'accessing'!
+
+operationString
+    ^ 'downgrade'
+! !
+
+!MetacelloAllowProjectDowngrade methodsFor:'handlers'!
+
+handleOnDownGrade: onDownGradeBlock onUpgrade: onUpgradeBlock
+    ^ onDownGradeBlock cull: self cull: self existingProjectRegistration cull: self newProjectRegistration
+!
+
+handleResolutionFor: aScriptEngine
+    ^ aScriptEngine handleDowngrade: self
+! !
+
+!MetacelloAllowProjectDowngrade class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAllowProjectUpgrade.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,41 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloResolveProjectUpgrade subclass:#MetacelloAllowProjectUpgrade
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloAllowProjectUpgrade methodsFor:'accessing'!
+
+operationString
+    ^ 'upgrade'
+! !
+
+!MetacelloAllowProjectUpgrade methodsFor:'exception handling'!
+
+defaultAction
+    "Default for Upgrade is to allow"
+
+    self checkAllowed.
+    ^ self newProjectRegistration
+! !
+
+!MetacelloAllowProjectUpgrade methodsFor:'handlers'!
+
+handleOnDownGrade: onDownGradeBlock onUpgrade: onUpgradeBlock
+    ^ onUpgradeBlock cull: self cull: self existingProjectRegistration cull: self newProjectRegistration
+!
+
+handleResolutionFor: aScriptEngine
+    ^ aScriptEngine handleUpgrade: self
+! !
+
+!MetacelloAllowProjectUpgrade class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloBaseConfiguration.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+ConfigurationOf subclass:#MetacelloBaseConfiguration
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Deprecated'
+!
+
+
+!MetacelloBaseConfiguration class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloBaselineConstructor.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,84 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractVersionConstructor subclass:#MetacelloBaselineConstructor
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloBaselineConstructor class methodsFor:'instance creation'!
+
+on: aConfig
+    ^ self new
+        on: aConfig;
+        yourself
+!
+
+on: aConfig project: aProject
+    ^ self new
+        on: aConfig project: aProject;
+        yourself
+! !
+
+!MetacelloBaselineConstructor methodsFor:'accessing'!
+
+projectClass
+    ^ MetacelloMCBaselineProject
+! !
+
+!MetacelloBaselineConstructor methodsFor:'initialization'!
+
+on: aConfig
+    self calculate: aConfig project: nil
+!
+
+on: aConfig project: aProject
+    self calculate: aConfig project: aProject
+! !
+
+!MetacelloBaselineConstructor methodsFor:'pragma extraction'!
+
+extractBaselinePragmaFor: aClass
+    | pragmas |
+    pragmas := Pragma allNamed: #'baseline' in: aClass.
+    pragmas isEmpty
+        ifTrue: [ ^ self error: 'No #baseline pragma found' ].
+    ^ pragmas first
+! !
+
+!MetacelloBaselineConstructor methodsFor:'private'!
+
+calculate: aConfig project: aProject
+    | pragma versionMap versionSpec |
+    self configuration: aConfig.
+    pragma := self extractBaselinePragmaFor: aConfig class.
+    self
+        setProject:
+            (aProject
+                ifNil: [ 
+                    [ aConfig class project ]
+                        on: MessageNotUnderstood
+                        do: [ :ex | ex return: nil ] ]).
+    versionSpec := self project versionSpec.
+    self root: versionSpec.
+    self evaluatePragma: pragma.
+    versionMap := Dictionary new.
+    self project attributes
+        do: [ :attribute | 
+            | blockList |
+            (blockList := self attributeMap at: attribute ifAbsent: [  ]) ~~ nil
+                ifTrue: [ blockList do: [ :block | self with: versionSpec during: block ] ] ].
+    versionSpec versionString: self project singletonVersionName.
+    versionMap at: versionSpec versionString put: versionSpec createVersion.
+    self project map: versionMap.
+    self project configuration: aConfig
+! !
+
+!MetacelloBaselineConstructor class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloBaselineSpecGenerator.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,33 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloProjectSpecGenerator subclass:#MetacelloBaselineSpecGenerator
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloBaselineSpecGenerator methodsFor:'accessing'!
+
+projectSpecCreationBlock
+    ^ [ :projectName | {(MetacelloMCBaselineProject new baselineOfProjectSpec name: projectName)} ]
+!
+
+projectSpecListBlock
+    ^ [ MetacelloProjectRegistration baselineProjectSpecs ]
+!
+
+projectSpecLookupBlock
+    ^ [ :projectName | 
+    {(MetacelloProjectRegistration
+        projectSpecForClassNamed: (MetacelloScriptEngine baselineNameFrom: projectName)
+        ifAbsent: [  ])} ]
+! !
+
+!MetacelloBaselineSpecGenerator class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloCannotUpdateReleasedVersionError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,24 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloCannotUpdateReleasedVersionError
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloCannotUpdateReleasedVersionError methodsFor:'private'!
+
+isResumable
+	"Determine whether an exception is resumable."
+
+	^ true
+! !
+
+!MetacelloCannotUpdateReleasedVersionError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloCleanLoadAndTestsNotification.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloCleanNotification subclass:#MetacelloCleanLoadAndTestsNotification
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloCleanLoadAndTestsNotification class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloCleanLoadNotification.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloCleanNotification subclass:#MetacelloCleanLoadNotification
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloCleanLoadNotification class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloCleanNotification.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,43 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloCleanNotification
+	instanceVariableNames:'version'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloCleanNotification class methodsFor:'exceptioninstantiator'!
+
+signal: aMetacelloVersion
+
+	^ self new signal: aMetacelloVersion
+! !
+
+!MetacelloCleanNotification methodsFor:'accessing'!
+
+version
+	^ version
+!
+
+version: anObject
+	version := anObject
+! !
+
+!MetacelloCleanNotification methodsFor:'signaling'!
+
+signal: aMetacelloVersion
+
+        self version: aMetacelloVersion.
+        ^ self raiseRequest
+
+    "Modified: / 02-10-2012 / 23:31:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloCleanNotification class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloClearStackCacheNotification.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloClearStackCacheNotification
+	instanceVariableNames:'cacheNames'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloClearStackCacheNotification methodsFor:'accessing'!
+
+cacheNames
+	^ cacheNames
+!
+
+cacheNames: anArray
+	cacheNames := anArray
+! !
+
+!MetacelloClearStackCacheNotification methodsFor:'signaling'!
+
+signal: anArray
+        "Signal the occurrence of an exceptional condition with a specified cacheName."
+
+        self cacheNames: anArray.
+        ^ self raiseSignal
+
+    "Modified: / 02-10-2012 / 23:34:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloClearStackCacheNotification class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloConfigurationSpecGenerator.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,33 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloProjectSpecGenerator subclass:#MetacelloConfigurationSpecGenerator
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloConfigurationSpecGenerator methodsFor:'accessing'!
+
+projectSpecCreationBlock
+    ^ [ :projectName | {(MetacelloMCProject new configurationOfProjectSpec name: projectName)} ]
+!
+
+projectSpecListBlock
+    ^ [ MetacelloProjectRegistration configurationProjectSpecs ]
+!
+
+projectSpecLookupBlock
+    ^ [ :projectName | 
+    {(MetacelloProjectRegistration
+        projectSpecForClassNamed: (MetacelloScriptEngine configurationNameFrom: projectName)
+        ifAbsent: [  ])} ]
+! !
+
+!MetacelloConfigurationSpecGenerator class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloConflictingProjectError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptingError subclass:#MetacelloConflictingProjectError
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloConflictingProjectError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloCopyMemberSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,44 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMemberSpec subclass:#MetacelloCopyMemberSpec
+	instanceVariableNames:'sourceName'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Members'
+!
+
+
+!MetacelloCopyMemberSpec methodsFor:'accessing'!
+
+methodUpdateSelector
+
+	^#copy:
+!
+
+sourceName
+
+	^sourceName
+!
+
+sourceName: aString
+
+	sourceName := aString
+! !
+
+!MetacelloCopyMemberSpec methodsFor:'actions'!
+
+applyAdd: addBlock copy: copyBlock merge: mergeBlock remove: removeBlock
+    copyBlock value: self
+!
+
+applyToList: aListSpec
+
+	aListSpec copy: self
+! !
+
+!MetacelloCopyMemberSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloErrorInProjectConstructionNotification.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,54 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloErrorInProjectConstructionNotification
+	instanceVariableNames:'versionString exception'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloErrorInProjectConstructionNotification class methodsFor:'instance creation'!
+
+versionString: aString exception: anException
+    ^ self new
+        versionString: aString;
+        exception: anException;
+        raiseSignal
+
+    "Modified: / 02-10-2012 / 23:33:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloErrorInProjectConstructionNotification methodsFor:'accessing'!
+
+exception
+	^ exception
+!
+
+exception: anObject
+	exception := anObject
+!
+
+versionString
+	^ versionString
+!
+
+versionString: anObject
+	versionString := anObject
+! !
+
+!MetacelloErrorInProjectConstructionNotification methodsFor:'exception description'!
+
+defaultAction
+    "Answer false if you want the version recorded in the errorMap.
+	Answer true if you want to go ahead and throw the error"
+
+    ^ false
+! !
+
+!MetacelloErrorInProjectConstructionNotification class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloGenericProjectSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,174 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloProjectSpec subclass:#MetacelloGenericProjectSpec
+	instanceVariableNames:'projectPackage repositories'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloGenericProjectSpec methodsFor:'accessing'!
+
+getRepositories
+    "raw access to iv"
+
+    ^ repositories
+!
+
+name: aString
+    super name: aString.
+    self projectPackage: nil
+!
+
+projectPackage
+    self subclassResponsibility
+!
+
+projectPackage: aProjectPackage
+    self shouldBeMutable.
+    projectPackage := aProjectPackage
+!
+
+repositories
+    repositories ifNil: [ repositories := self project repositoriesSpec ].
+    ^ repositories
+!
+
+repositories: anObject
+    self shouldBeMutable.
+    repositories := anObject.
+    self projectPackage: nil
+!
+
+repository: aStringOrMetacelloRepositorySpec
+    self repositories repository: aStringOrMetacelloRepositorySpec.
+    self projectPackage: nil
+!
+
+repository: aString username: username password: password
+    self repositories repository: aString username: username password: password.
+    self projectPackage: nil
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'construction'!
+
+projectPackage: aBlock constructor: aVersionConstructor
+    aVersionConstructor projectPackageForProject: aBlock
+!
+
+repositories: aBlock constructor: aVersionConstructor
+    aVersionConstructor repositoriesForProject: aBlock
+!
+
+repository: anObject constructor: aVersionConstructor
+    aVersionConstructor repositoryForProject: anObject
+!
+
+repository: aString username: username password: password constructor: aVersionConstructor
+    aVersionConstructor repositoryForProject: aString username: username password: password
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'copying'!
+
+postCopy
+    super postCopy.
+    repositories := repositories copy.
+    projectPackage := nil
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'loading'!
+
+determineCurrentVersionForLoad
+    self subclassResponsibility
+!
+
+load
+    (MetacelloLookupProjectSpecForLoad new
+        projectSpec: self;
+        yourself) raiseSignal performLoad
+
+    "Modified: / 02-10-2012 / 23:33:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+loadVersion: aVersionOrNil
+    self subclassResponsibility
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'merging'!
+
+mergeMap
+    | map |
+    map := super mergeMap.
+    map at: #'repositories' put: repositories.
+    ^ map
+!
+
+mergeSpec: anotherSpec
+    | newSpec map anotherRepositories |
+    newSpec := super mergeSpec: anotherSpec.
+    map := anotherSpec mergeMap.
+    (anotherRepositories := map at: #'repositories') ~~ nil
+        ifTrue: [ 
+            newSpec
+                repositories:
+                    (self getRepositories == nil
+                        ifTrue: [ anotherRepositories ]
+                        ifFalse: [ self repositories mergeSpec: anotherRepositories ]) ].
+    ^ newSpec
+!
+
+nonOverridable
+    ^ super nonOverridable , #(#'projectPackage' #'repositories')
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'querying'!
+
+repository
+    | specs |
+    self deprecated: 'Use repositories or repositorySpecs'.
+    (specs := self repositorySpecs) isEmpty
+        ifTrue: [ ^ nil ].
+    ^ specs first
+!
+
+repositoryDescriptions
+    ^ self repositorySpecs collect: [ :repoSpec | repoSpec description ]
+!
+
+repositorySpecs
+    repositories ifNil: [ ^ #() ].
+    ^ self repositories map values
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'scripting'!
+
+compareEqual: aMetacelloProjectSpec
+    "'projectPackage repositories'"
+
+    ^ (super compareEqual: aMetacelloProjectSpec)
+        and: [ self repositories compareEqual: aMetacelloProjectSpec repositories ]
+!
+
+mergeScriptRepository: anotherSpec
+    self repositories: anotherSpec repositories
+!
+
+metacelloRegistrationHash
+    "projectPackage (ignored) repositories"
+
+    ^ super metacelloRegistrationHash bitXor: self repositories metacelloRegistrationHash
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'testing'!
+
+hasRepository
+    ^ self repositorySpecs notEmpty
+! !
+
+!MetacelloGenericProjectSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloGroupSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,64 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractPackageSpec subclass:#MetacelloGroupSpec
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloGroupSpec methodsFor:'accessing'!
+
+answers: aListOfPairs
+
+	self shouldNotImplement
+!
+
+requires: aCollection
+
+	self shouldNotImplement
+! !
+
+!MetacelloGroupSpec methodsFor:'printing'!
+
+configMethodCascadeOn: aStream member: aMember last: lastCascade indent: indent
+
+	aMember methodUpdateSelector == #remove:
+		ifTrue: [ aStream nextPutAll: 'removeGroup: ', self name printString. ]
+		ifFalse: [
+			aStream 
+				nextPutAll: 'group: ', self name printString;
+				space; 
+				nextPutAll: aMember methodUpdateSelector asString, ' #('.
+			self includes do: [:str | aStream nextPutAll: str printString, ' ' ].
+			aStream nextPut: $) ].
+	lastCascade
+		ifTrue: [ aStream nextPut: $. ]
+		ifFalse: [ aStream nextPut: $;; cr ].
+!
+
+configMethodOn: aStream indent: indent
+
+	aStream 
+		tab: indent;
+		nextPutAll: 'spec '; cr;
+		tab: indent + 1;
+		nextPutAll: 'name: ', self name printString, ';'.
+	self configMethodBodyOn: aStream hasName: true cascading: false indent: indent + 1.
+	aStream nextPut: $.
+! !
+
+!MetacelloGroupSpec methodsFor:'visiting'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+
+	groupBlock value: self
+! !
+
+!MetacelloGroupSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloLockedProjectError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptingError subclass:#MetacelloLockedProjectError
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloLockedProjectError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloLookupBaselineSpecForEnsureLoad.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptProjectSpecNotification subclass:#MetacelloLookupBaselineSpecForEnsureLoad
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloLookupBaselineSpecForEnsureLoad methodsFor:'exception description'!
+
+defaultAction
+	"Answer <true> if you want to ensure the load of the baseline ... default is to load the baseline"
+
+	^ true
+! !
+
+!MetacelloLookupBaselineSpecForEnsureLoad methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+	^ aScriptEngine handleLookupBaselineSpecForEnsureLoad: self
+! !
+
+!MetacelloLookupBaselineSpecForEnsureLoad class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloLookupProjectSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,22 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptProjectSpecNotification subclass:#MetacelloLookupProjectSpec
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloLookupProjectSpec methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+    ^ aScriptEngine handleLookupProjectSpec: self
+! !
+
+!MetacelloLookupProjectSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloLookupProjectSpecForLoad.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,33 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptProjectSpecNotification subclass:#MetacelloLookupProjectSpecForLoad
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloLookupProjectSpecForLoad methodsFor:'exception description'!
+
+defaultAction
+    "Result of signal should be the MetacelloProjectSpecForLoad to be used to perform the load. 
+	Create a MetacelloProjectSpecForLoad and use the overrideProjectSpec: if you want to supply a different projectSpec"
+
+    ^ MetacelloProjectSpecForLoad new
+        projectSpec: self projectSpec;
+        yourself
+! !
+
+!MetacelloLookupProjectSpecForLoad methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+    ^ aScriptEngine handleLookupProjectSpecForLoad: self
+! !
+
+!MetacelloLookupProjectSpecForLoad class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMemberListSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,220 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloMemberListSpec
+	instanceVariableNames:'list memberMap'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Members'
+!
+
+
+!MetacelloMemberListSpec methodsFor:'accessing'!
+
+list
+
+	list == nil ifTrue: [ list := OrderedCollection new ].
+	^list
+!
+
+list: aCollection
+
+	list := aCollection.
+	self clearMemberMap
+!
+
+map
+        
+        | map |
+        memberMap notNil ifTrue: [ ^memberMap ].
+        map := Dictionary new.
+        self list do: [:member | 
+                member
+                        applyAdd: [:memberSpec | self mapAdd: memberSpec into: map ] 
+                        copy: [:memberSpec | self mapCopy: memberSpec into: map ]
+                        merge: [:memberSpec | self mapMerge: memberSpec into: map ] 
+                        remove: [:memberSpec | self mapRemove: memberSpec into: map ]].
+        memberMap := map.
+        ^memberMap
+
+    "Modified: / 03-10-2012 / 22:15:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloMemberListSpec methodsFor:'actions'!
+
+add: aSpec
+
+	self subclassResponsibility
+!
+
+copy: aMemberSpec
+
+	self addMember: aMemberSpec
+!
+
+copy: specNamed to: aSpec
+
+	self subclassResponsibility
+!
+
+merge: aSpec
+
+	self subclassResponsibility
+!
+
+remove: aSpec
+
+	self subclassResponsibility
+! !
+
+!MetacelloMemberListSpec methodsFor:'adding'!
+
+addMember: aMember
+
+	self list add: aMember.
+	self clearMemberMap
+! !
+
+!MetacelloMemberListSpec methodsFor:'copying'!
+
+postCopy
+
+	super postCopy.
+	list := list copy.
+	self clearMemberMap
+! !
+
+!MetacelloMemberListSpec methodsFor:'enumeration'!
+
+collect: aBlock 
+	| newCollection |
+	newCollection :=OrderedCollection new.
+	self do: [:each | newCollection add: (aBlock value: each)].
+	^ newCollection
+!
+
+detect: aBlock
+	"Evaluate aBlock with each of the receiver's elements as the argument. 
+	Answer the first element for which aBlock evaluates to true."
+
+	^ self detect: aBlock ifNone: [ self error: 'Object is not in the collection.' ]
+!
+
+detect: aBlock ifNone: exceptionBlock
+	"Evaluate aBlock with each of the receiver's elements as the argument.  
+	Answer the first element for which aBlock evaluates to true. If none  
+	evaluate to true, then evaluate the argument, exceptionBlock."
+
+	self
+		do: [ :each | 
+			(aBlock value: each)
+				ifTrue: [ ^ each ] ].
+	^ exceptionBlock value
+!
+
+do: aBlock
+
+	self map values do: aBlock
+!
+
+select: aBlock 
+	| newCollection |
+	newCollection := OrderedCollection new.
+	self do: [:each | (aBlock value: each) ifTrue: [newCollection add: each]].
+	^newCollection
+!
+
+specListDetect: aBlock
+	"Evaluate aBlock with each of the receiver's elements as the argument. 
+	Answer the first element for which aBlock evaluates to true."
+
+	^ self specListDetect: aBlock ifNone: [ self error: 'Object is not in the collection.' ]
+!
+
+specListDetect: aBlock ifNone: exceptionBlock
+	"Evaluate aBlock with each of the receiver's elements as the argument.  
+	Answer the first element for which aBlock evaluates to true. If none  
+	evaluate to true, then evaluate the argument, exceptionBlock."
+
+	self
+		specListDo: [ :each | 
+			(aBlock value: each)
+				ifTrue: [ ^ each ] ].
+	^ exceptionBlock value
+!
+
+specListDo: aBlock
+
+	self list do: [:member |  aBlock value: member spec ]
+!
+
+specListSelect: aBlock 
+	| newCollection |
+	newCollection := OrderedCollection new.
+	self specListDo: [:each | (aBlock value: each) ifTrue: [newCollection add: each]].
+	^newCollection
+! !
+
+!MetacelloMemberListSpec methodsFor:'merging'!
+
+mergeSpec: anotherSpec
+
+	| newSpec val |
+	newSpec := super mergeSpec: anotherSpec.
+	newSpec list: self list copy.
+	anotherSpec list do: [:groupMember | groupMember applyToList: newSpec ].
+	^newSpec
+! !
+
+!MetacelloMemberListSpec methodsFor:'private'!
+
+clearMemberMap
+
+	memberMap := nil.
+!
+
+mapAdd: aMemberSpec into: map
+	
+	map at: aMemberSpec name put: aMemberSpec spec
+!
+
+mapCopy: aMemberSpec into: map
+    | spec |
+    spec := map at: aMemberSpec sourceName ifAbsent: [  ].
+    spec == nil
+        ifTrue: [ ^ self error: 'Source spec named ' , aMemberSpec sourceName printString , ' not found' ]
+        ifFalse: [ 
+            spec aboutToCopy.
+            map at: aMemberSpec name put: (spec copy mergeSpec: aMemberSpec spec copy) ]
+!
+
+mapMerge: aMemberSpec into: map
+	| spec |
+	spec :=  map at: aMemberSpec name ifAbsent: [].
+	spec == nil
+		ifTrue: [ map at: aMemberSpec name put: aMemberSpec spec copy ]
+		ifFalse: [ map at: aMemberSpec name put: (spec mergeSpec: aMemberSpec spec)]
+!
+
+mapRemove: aMemberSpec into: map
+	
+	map removeKey: aMemberSpec name ifAbsent: []
+! !
+
+!MetacelloMemberListSpec methodsFor:'testing'!
+
+isEmpty
+
+	^self list isEmpty
+!
+
+notEmpty
+
+	^self list notEmpty
+! !
+
+!MetacelloMemberListSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMemberSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,79 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloMemberSpec
+	instanceVariableNames:'name spec'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Members'
+!
+
+
+!MetacelloMemberSpec methodsFor:'accessing'!
+
+methodUpdateSelector
+
+	^self subclassResponsibility
+!
+
+name
+
+	^name
+!
+
+name: aString
+
+	name := aString
+!
+
+sourceName
+
+	^self name
+!
+
+spec
+
+	^spec
+!
+
+spec: aMetacelloSpec
+
+	spec := aMetacelloSpec
+! !
+
+!MetacelloMemberSpec methodsFor:'actions'!
+
+applyAdd: addBlock copy: copyBlock merge: mergeBlock remove: removeBlock
+
+	self subclassResponsibility
+
+!
+
+applyToList: aListSpec
+
+	self subclassResponsibility
+! !
+
+!MetacelloMemberSpec methodsFor:'printing'!
+
+configMethodCascadeOn: aStream last: lastCascade indent: indent
+
+	self spec 
+		configMethodCascadeOn: aStream 
+		member: self 
+		last: lastCascade 
+		indent: indent
+!
+
+configMethodOn: aStream indent: indent
+
+	aStream nextPutAll: self class name asString, ' member: ('.
+	self spec configMethodOn: aStream indent: indent.
+	aStream nextPutAll: ')'.
+! !
+
+!MetacelloMemberSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMergeMemberSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,35 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMemberSpec subclass:#MetacelloMergeMemberSpec
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Members'
+!
+
+
+!MetacelloMergeMemberSpec methodsFor:'accessing'!
+
+methodUpdateSelector
+
+	^#with:
+! !
+
+!MetacelloMergeMemberSpec methodsFor:'actions'!
+
+applyAdd: addBlock copy: copyBlock merge: mergeBlock remove: removeBlock
+
+	mergeBlock value: self
+!
+
+applyToList: aListSpec
+
+	aListSpec merge: self
+! !
+
+!MetacelloMergeMemberSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMethodSection.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,26 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloMethodSection
+	instanceVariableNames:'attribute'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloMethodSection methodsFor:'accessing'!
+
+attribute
+	^ attribute
+!
+
+attribute: anObject
+	attribute := anObject
+! !
+
+!MetacelloMethodSection class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMethodSectionPath.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,33 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Array variableSubclass:#MetacelloMethodSectionPath
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloMethodSectionPath methodsFor:'conversion'!
+
+asAttributeOrPath
+    self size = 1
+        ifTrue: [ 
+            | attribute |
+            attribute := self at: 1.
+            ^ attribute size = 1
+                ifTrue: [ attribute at: 1 ]
+                ifFalse: [ attribute ] ].
+    ^ self
+!
+
+asMetacelloAttributePath
+    ^ self
+! !
+
+!MetacelloMethodSectionPath class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMethodSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,75 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloMethodSpec
+	instanceVariableNames:'project selector category versionString methodSections'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloMethodSpec methodsFor:'accessing'!
+
+category
+	^ category
+!
+
+category: anObject
+	category := anObject
+!
+
+methodSections
+
+	methodSections == nil ifTrue: [ methodSections := OrderedCollection new ].
+	^ methodSections
+!
+
+methodSections: anObject
+	methodSections := anObject
+!
+
+project
+	^ project
+!
+
+project: anObject
+	project := anObject
+!
+
+selector
+	^ selector
+!
+
+selector: anObject
+	selector := anObject
+!
+
+versionString
+	^ versionString
+!
+
+versionString: aStringOrSymbol
+	versionString := aStringOrSymbol
+! !
+
+!MetacelloMethodSpec methodsFor:'method generation'!
+
+compileMethod
+
+	(project configuration class
+		compile: self methodSource
+		classified: self category) == nil
+		ifTrue: [ self error: 'Error compiling the method' ]
+!
+
+methodSource
+
+	self subclassResponsibility
+! !
+
+!MetacelloMethodSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloPackageSpecResolutionError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,63 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloPackageSpecResolutionError
+	instanceVariableNames:'packageSpec repositories repositoryError'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloPackageSpecResolutionError methodsFor:'accessing'!
+
+description
+    "Return a textual description of the exception."
+
+    ^ 'Could not resolve: ' , packageSpec name , ' [' , packageSpec file , ']' , ' in' , self repositoryString
+        ,
+            (repositoryError == nil
+                ifTrue: [ '' ]
+                ifFalse: [ 
+                    "report repository error to user here, since failure here is likely to be due to earlier repository error"
+                    ' ERROR: ' , repositoryError description printString ])
+!
+
+packageSpec
+	^ packageSpec
+!
+
+packageSpec: anObject
+	packageSpec := anObject
+!
+
+repositories
+	^ repositories
+!
+
+repositories: anObject
+	repositories := anObject
+!
+
+repositoryError
+	^ repositoryError
+!
+
+repositoryError: anObject
+	repositoryError := anObject
+! !
+
+!MetacelloPackageSpecResolutionError methodsFor:'private'!
+
+repositoryString
+    | repositoryString |
+    repositoryString := ''.
+    self repositories do: [ :repo | repositoryString := repositoryString , ' ' , repo description ].
+    ^ repositoryString
+! !
+
+!MetacelloPackageSpecResolutionError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloPackagesSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,207 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMemberListSpec subclass:#MetacelloPackagesSpec
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloPackagesSpec methodsFor:'accessing'!
+
+applyIncludesTo: orderedSpecs for: pkgSpec firstTime: firstTime
+	| movedSpecs baseIndex includedSpec result |
+	movedSpecs := Set new.
+	baseIndex := orderedSpecs indexOf: pkgSpec.
+	pkgSpec includesForPackageOrdering
+		do: [:includedSpecName | 
+			includedSpec := orderedSpecs
+						detect: [:spec | spec name = includedSpecName ]
+						ifNone: [].
+			(self slideIn: orderedSpecs spec: includedSpec baseIndex: baseIndex seen: IdentitySet new firstTime: firstTime)
+				ifTrue: [ movedSpecs add: includedSpec name ]].
+	^ movedSpecs
+!
+
+packageNamed: aString ifAbsent: aBlock
+
+	^self map at: aString ifAbsent: aBlock
+!
+
+packageSpecsInLoadOrder
+    | orderedSpecs moved lastMovedSpecs count terminationLimit map specsWithIncludes firstTime |
+    "specification order is the default order"
+    map := self map.
+    orderedSpecs := OrderedCollection new.
+    self list
+        do: [ :member | 
+            | spec |
+            spec := map at: member name ifAbsent: [  ].
+            (spec == nil or: [ orderedSpecs includes: spec ])
+                ifFalse: [ orderedSpecs add: spec ] ].
+    orderedSpecs isEmpty
+        ifTrue: [ ^ orderedSpecs ].
+    moved := true.
+    count := 0.
+    terminationLimit := orderedSpecs size * 2.
+    [ moved ]
+        whileTrue: [ 
+            count := count + 1.
+            count > terminationLimit
+                ifTrue: [ 
+                    "Cheap termination hack - an APPARENT loop"
+                    self error: 'Apparent loop in before/after dependency definitions' ].
+            moved := false.
+            orderedSpecs
+                do: [ :packageSpec | moved := moved or: [ self sortPackageSpecs: orderedSpecs for: packageSpec ] ] ].
+    lastMovedSpecs := Set new.
+    moved := true.
+    count := 0.
+    specsWithIncludes := orderedSpecs select: [ :pkgSpec | pkgSpec includesForPackageOrdering isEmpty not ].
+    firstTime := true.
+    [ moved ]
+        whileTrue: [ 
+            | result |
+            count := count + 1.	"count > terminationLimit"
+            count > 14
+                ifTrue: [ 
+                    "Cheap termination hack - an APPARENT loop"
+                    self error: 'Apparent loop in before/after dependency definitions' ].
+            moved := false.
+            result := Set new.
+            specsWithIncludes
+                do: [ :packageSpec | result addAll: (self applyIncludesTo: orderedSpecs for: packageSpec firstTime: firstTime) ].
+            result size = lastMovedSpecs size
+                ifTrue: [ 
+                    result
+                        do: [ :name | 
+                            (lastMovedSpecs includes: name)
+                                ifFalse: [ moved := true ] ] ]
+                ifFalse: [ moved := true ].
+            lastMovedSpecs := result.
+            firstTime := false ].
+    ^ orderedSpecs
+!
+
+slideIn: orderedSpecs spec: targetSpec baseIndex: baseIndex seen: seen firstTime: firstTime
+	| targetIndex requires targetRequires targetRequiresIndexes minIndex baseSpec required |
+
+	(seen includes: targetSpec) ifTrue: [ ^false ].
+	targetIndex := orderedSpecs indexOf: targetSpec.
+	baseIndex >= targetIndex ifTrue: [ ^false ].
+	required := false.
+	baseSpec := orderedSpecs at: baseIndex.
+	baseIndex + 1 to: targetIndex - 1 do: [:index | | spec |
+		spec := orderedSpecs at: index.
+		(spec requires includes: baseSpec name) ifTrue: [ required := true ]].
+	firstTime ifFalse: [ required ifFalse: [ ^false ]].
+	requires := targetSpec requires.
+	targetRequires := orderedSpecs
+				select: [:spec | requires includes: spec name].
+	targetRequiresIndexes := targetRequires
+				collect: [:spec | orderedSpecs indexOf: spec].
+	targetRequiresIndexes add: baseIndex.
+	minIndex := targetRequiresIndexes
+				detectMax: [:each | each].
+	minIndex + 1 < targetIndex
+		ifTrue: [
+			orderedSpecs remove: targetSpec.
+			orderedSpecs add: targetSpec afterIndex: minIndex.
+			seen add: targetSpec ]
+		ifFalse: [ ^self slideIn: orderedSpecs spec: (orderedSpecs at: minIndex) baseIndex: 1 seen: seen firstTime: firstTime].
+	^true
+! !
+
+!MetacelloPackagesSpec methodsFor:'actions'!
+
+add: aSpec
+
+	aSpec addToMetacelloPackages: self
+!
+
+copy: specNamed to: spec
+
+	self addMember: 
+		(self copyMember 
+			name: spec name;
+			sourceName: specNamed;
+			spec: spec;
+			yourself)
+!
+
+merge: aSpec
+
+	aSpec mergeIntoMetacelloPackages: self
+!
+
+remove: aSpec
+
+	aSpec removeFromMetacelloPackages: self
+! !
+
+!MetacelloPackagesSpec methodsFor:'printing'!
+
+configMethodOn: aStream indent: indent
+
+	| packageSpecs |
+	packageSpecs := self map values.
+	packageSpecs size = 0 ifTrue: [ ^aStream nextPutAll: 'spec add: []' ].
+	packageSpecs size = 1
+		ifTrue: [
+			aStream 
+				tab: indent; 
+				nextPutAll: 'spec add: ['; cr.
+			packageSpecs first configMethodOn: aStream indent: indent + 1.
+			aStream nextPut: $]; cr ]
+		ifFalse: [
+			aStream 
+				tab: indent; 
+				nextPutAll: 'spec'.
+			1 to: packageSpecs size do: [:index | | packageSpec |
+				packageSpec := packageSpecs at: index.
+				aStream 
+					tab: indent + 1;
+					nextPutAll: 'add: ['; cr.
+				packageSpec configMethodOn: aStream indent: indent + 2.
+				aStream nextPut: $].
+				index < packageSpecs size
+					ifTrue: [ aStream nextPut: $; ].
+				aStream cr ]]
+! !
+
+!MetacelloPackagesSpec methodsFor:'private'!
+
+sortPackageSpecs: orderedSpecs for: packageSpec
+
+	| packageIndex moved movePackage targetPackage targetIndex targetPackages |
+	packageIndex := orderedSpecs indexOf: packageSpec.
+	moved := movePackage := false.
+	targetPackages := packageSpec requires.
+	targetPackages do: [:targetPackageName |
+		targetPackage := orderedSpecs 
+			detect: [:each | each name = targetPackageName ] 
+			ifNone: [].
+		targetIndex := orderedSpecs indexOf: targetPackage.
+		movePackage := movePackage or: [ packageIndex <= targetIndex ]].
+	movePackage 
+		ifTrue: [
+			moved := true.
+			orderedSpecs remove: packageSpec ifAbsent: [ ^self error: 'unexpected error removing package' ].
+			targetIndex := 0.
+			targetPackages do: [:targetPackageName | 
+				(targetPackage := orderedSpecs detect: [:each | 
+					each name = targetPackageName ] ifNone: []) ~~ nil
+						ifTrue: [ targetIndex := targetIndex max: (orderedSpecs indexOf: targetPackage) ]].
+			targetIndex == 0
+				ifTrue: [ orderedSpecs add: packageSpec beforeIndex: packageIndex ]
+				ifFalse: [ orderedSpecs add: packageSpec afterIndex: targetIndex ]].
+	^moved
+! !
+
+!MetacelloPackagesSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloPlatform.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,321 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloPlatform
+	instanceVariableNames:'bypassProgressBars bypassGoferLoadUpdateCategories'
+	classVariableNames:'Current'
+	poolDictionaries:''
+	category:'Metacello-Core-Model'
+!
+
+
+!MetacelloPlatform class methodsFor:'accessing'!
+
+current
+	Current
+		ifNil: [Current := MetacelloPlatform new].
+	^ Current
+! !
+
+!MetacelloPlatform class methodsFor:'initialize-release'!
+
+initialize
+	"MetacelloPlatform initialize"
+	"MetacelloGemStonePlatform initialize"
+	"MetacelloPharoPlatform initialize"
+	"MetacelloSqueakPlatform initialize"
+
+	Current := self new
+! !
+
+!MetacelloPlatform methodsFor:'accessing'!
+
+bypassGoferLoadUpdateCategories
+
+	bypassGoferLoadUpdateCategories == nil ifTrue: [ bypassGoferLoadUpdateCategories := false ].
+	^ bypassGoferLoadUpdateCategories
+!
+
+bypassGoferLoadUpdateCategories: anObject
+	bypassGoferLoadUpdateCategories := anObject
+!
+
+bypassProgressBars
+
+	bypassProgressBars == nil ifTrue: [ bypassProgressBars := false ].
+	^ bypassProgressBars
+!
+
+bypassProgressBars: anObject
+	bypassProgressBars := anObject
+! !
+
+!MetacelloPlatform methodsFor:'attributes'!
+
+defaultPlatformAttributes
+	| versionString |
+	Smalltalk at: #SystemVersion ifPresent: [:cl |
+		versionString := cl current version.
+		(versionString beginsWith: 'Pharo')
+			ifTrue: [ ^ #(#squeakCommon #pharo ) ].
+		(versionString beginsWith: 'Squeak')
+			ifTrue: [^ #(#squeakCommon #squeak )].
+		"see http://code.google.com/p/metacello/issues/detail?id=146"
+		(versionString includesSubString: 'Pharo')
+			ifTrue: [ ^ #(#squeakCommon #pharo ) ].
+		(versionString includesSubString: 'Squeak')
+			ifTrue: [^ #(#squeakCommon #squeak )].
+		self error: 'Unrecognized version of Squeak/Pharo: ', versionString ].
+	^ #(#gemstone )
+! !
+
+!MetacelloPlatform methodsFor:'caching'!
+
+clearCurrentVersionCache
+	MetacelloClearStackCacheNotification signal: #(#currentVersion #currentVersionAgainst: #currentVersionInfo)
+!
+
+primeStackCacheFor: cacheName doing: noArgBlock defaultDictionary: aDictionary
+
+	self deprecated: 'use #primeStackCacheWith:doing:'.
+	self 
+		useStackCacheDuring: [:dict | | cache |
+			cache := dict at: cacheName ifAbsent: [].
+			cache == nil
+				ifTrue: [ 
+					cache := Dictionary new.
+					dict at: cacheName put: cache ].
+			^noArgBlock value ] 
+		defaultDictionary: aDictionary
+!
+
+primeStackCacheWith: aDictionary doing: noArgBlock
+
+	self 
+		useStackCacheDuring: [:dict | ^noArgBlock value ] 
+		defaultDictionary: aDictionary
+!
+
+stackCacheFor: cacheName at: key doing: aBlock
+
+	^self stackCacheFor: cacheName cacheClass: Dictionary at: key doing: aBlock
+!
+
+stackCacheFor: cacheName cacheClass: cacheClass at: key doing: aBlock
+
+	self 
+		useStackCacheDuring: [:dict | | cache |
+			cache := dict at: cacheName ifAbsent: [].
+			cache ~~ nil
+				ifTrue: [ | value hasEntry |
+					hasEntry := true.
+					value := cache at: key ifAbsent: [ hasEntry := false ].
+					hasEntry ifTrue: [ ^value ]]
+				ifFalse: [ 
+					cache := cacheClass new.
+					dict at: cacheName put: cache ].
+			^aBlock value: cache ] 
+		defaultDictionary: nil
+!
+
+useStackCacheDuring: aBlock defaultDictionary: defaultDictionary
+        | dict |
+        dict := MetacelloStackCacheNotification raiseSignal.
+        dict == nil
+                ifTrue: [ 
+                        dict := defaultDictionary == nil
+                                ifTrue: [ Dictionary new ]
+                                ifFalse: [ defaultDictionary ] ].
+        [ ^ aBlock value: dict ]
+                on: MetacelloStackCacheNotification , MetacelloClearStackCacheNotification
+                do: [ :ex | 
+                        (ex isKindOf: MetacelloStackCacheNotification)
+                                ifTrue: [ ex resume: dict ].
+                        (ex isKindOf: MetacelloClearStackCacheNotification)
+                                ifTrue: [ 
+                                        | keys |
+                                        keys := ex cacheNames.
+                                        keys ifNil: [ keys := dict keys ].
+                                        keys
+                                                do: [ :k | 
+                                                        (dict includesKey: k)
+                                                                ifTrue: [ 
+                                                                        | c |
+                                                                        c := dict at: k.
+                                                                        c keys do: [ :ck | c removeKey: ck ].
+                                                                        dict removeKey: k ] ].
+                                        ex resume ] ]
+
+    "Modified: / 02-10-2012 / 23:33:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloPlatform methodsFor:'github support'!
+
+downloadFile: url to: outputFileName
+    "download from <url> into <outputFileName>"
+
+    self subclassResponsibility
+!
+
+extractRepositoryFrom: zipFile to: directory
+    "unzip <zipFile> into <directory>"
+
+    self subclassResponsibility
+!
+
+fileDirectoryClass
+
+	^FileDirectory
+! !
+
+!MetacelloPlatform methodsFor:'notification'!
+
+collection: aCollection do: aBlock displaying: aString
+
+	aCollection do: aBlock
+!
+
+do: aBlock displaying: aString
+
+	aBlock value
+! !
+
+!MetacelloPlatform methodsFor:'reflection'!
+
+copyClass: oldClass as: newName inCategory: newCategoryName
+
+	self subclassResponsibility
+!
+
+globalNamed: globalName
+
+	^Smalltalk at: globalName
+!
+
+globalNamed: globalName ifAbsent: absentBlock
+
+	^Smalltalk at: globalName ifAbsent: absentBlock
+! !
+
+!MetacelloPlatform methodsFor:'repository creation'!
+
+createRepository: aRepositorySpec
+    | type |
+    type := aRepositorySpec type.
+    type = 'http'
+        ifTrue: [ 
+            ^ MCHttpRepository
+                location: aRepositorySpec description
+                user: aRepositorySpec username
+                password: aRepositorySpec password ].
+    type = 'directory'
+        ifTrue: [ ^ MCDirectoryRepository new directory: (FileDirectory on: aRepositorySpec description) ].
+    Smalltalk
+        at: #'MCFileTreeRepository'
+        ifPresent: [ :cl | 
+            type = 'filetree'
+                ifTrue: [ 
+                    | description headerSize |
+                    description := aRepositorySpec description.
+                    headerSize := 'filetree://' size.
+                    ^ cl new
+                        directory:
+                            (FileDirectory on: (aRepositorySpec description copyFrom: headerSize + 1 to: description size)) ] ].
+    Smalltalk
+        at: #'MCGitHubRepository'
+        ifPresent: [ :cl | 
+            type = 'github'
+                ifTrue: [ ^ cl location: aRepositorySpec description ] ].
+    type = 'dictionary'
+        ifTrue: [ 
+            | description headerSize globalName |
+            description := aRepositorySpec description.
+            headerSize := 'dictionary://' size.
+            globalName := (description copyFrom: headerSize + 1 to: description size) asSymbol.
+            ^ Smalltalk
+                at: globalName
+                ifAbsent: [ 
+                    Smalltalk
+                        at: globalName
+                        put:
+                            (MCDictionaryRepository new
+                                description: description;
+                                yourself) ] ].
+    ^ nil
+!
+
+extractTypeFromDescription: description
+    description == nil
+        ifTrue: [ ^ nil ].
+    ((description beginsWith: '/') or: [ description second = $: ])
+        ifTrue: [ ^ 'directory' ].
+    (description beginsWith: 'dictionary://')
+        ifTrue: [ ^ 'dictionary' ].
+    (description beginsWith: 'filetree://')
+        ifTrue: [ ^ 'filetree' ].
+    (description beginsWith: 'github://')
+        ifTrue: [ ^ 'github' ].
+    ^ 'http'
+! !
+
+!MetacelloPlatform methodsFor:'scripting'!
+
+defaultRepositoryDescription
+    ^ 'http://www.squeaksource.com/MetacelloRepository'
+! !
+
+!MetacelloPlatform methodsFor:'tests'!
+
+defaultTimeout
+	"squeak compatability"
+	^60
+! !
+
+!MetacelloPlatform methodsFor:'transactions'!
+
+transact: aBlock
+	"On GemStone, we want to optionally abort before command execution and commit after 
+	 common execution. Other plaforms don't need to do anything special.
+	 Returning out of block, skips commit."
+	
+	aBlock value
+! !
+
+!MetacelloPlatform methodsFor:'user interaction'!
+
+confirm: aString
+	
+	^(Smalltalk hasClassNamed: #UIManager)
+		ifTrue: [ (Smalltalk classNamed: #UIManager) default perform: #confirm: with: aString ]
+		ifFalse: [
+			"throw warning and answer true, if no way to announce"
+			Warning signal: aString.
+			true ]
+! !
+
+!MetacelloPlatform methodsFor:'utilities'!
+
+authorName
+
+	Smalltalk at: #Author ifPresent: [:cl | ^cl perform: #initials ].
+	^'no developer initials'
+!
+
+authorName: aString
+	"Primarily used for testing"
+
+	self subclassResponsibility
+!
+
+timestamp
+
+	^DateAndTime now printString
+! !
+
+!MetacelloPlatform class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
+
+MetacelloPlatform initialize!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProject.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,503 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloProject
+	instanceVariableNames:'versionMap symbolicVersionMap errorMap loader loaderClass
+		loadType configuration projectAttributes versionNumberClass'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Model'
+!
+
+
+!MetacelloProject class methodsFor:'instance creation'!
+
+new
+
+	| inst |
+	inst := self basicNew.
+	^inst configuration: inst; yourself
+!
+
+on: aConfig
+
+	^self basicNew configuration: aConfig; yourself
+! !
+
+!MetacelloProject class methodsFor:'accessing'!
+
+versionConstructorClass
+    ^ MetacelloVersionConstructor
+! !
+
+!MetacelloProject methodsFor:'accessing'!
+
+configuration
+	^ configuration
+!
+
+configuration: anObject
+	configuration := anObject
+!
+
+defaultBlessing
+
+	^#release
+!
+
+errorMap
+	^ errorMap
+!
+
+errorMap: anObject
+    errorMap ifNil: [ errorMap := Dictionary new ].
+    errorMap := anObject
+!
+
+label
+
+	^self configuration class name
+!
+
+loadType
+	"#atomic or #linear"
+
+	loadType == nil ifTrue: [ ^#atomic ].
+	^loadType
+!
+
+loadType: aSymbol
+	"#atomic or #linear"
+
+	loadType := aSymbol
+!
+
+map
+	versionMap ifNil: [ ^ Dictionary new ].
+	^ versionMap
+!
+
+map: aDictionary
+
+	versionMap := aDictionary
+!
+
+project
+
+	^self
+!
+
+symbolicVersionMap
+
+	^symbolicVersionMap
+				
+				
+!
+
+symbolicVersionMap: aDictionary
+
+	symbolicVersionMap := aDictionary
+				
+				
+! !
+
+!MetacelloProject methodsFor:'loading'!
+
+load: aVersionString
+
+	^(self version: aVersionString) load
+! !
+
+!MetacelloProject methodsFor:'printing'!
+
+printOn: aStream
+	| label |
+	self configuration class printOn: aStream.
+	aStream nextPut: $(.
+	self versions
+		do: [ :vrsn | 
+			aStream nextPutAll: vrsn versionString.
+			vrsn spec ~~ nil
+				ifTrue: [ 
+					(label := vrsn spec projectLabel) isEmpty
+						ifFalse: [ aStream nextPutAll: ' [' , label , ']' ] ].
+			aStream
+				nextPut: $,;
+				space ].
+	aStream nextPut: $)
+! !
+
+!MetacelloProject methodsFor:'private'!
+
+attributes
+
+	^(OrderedCollection with: #common)
+		addAll: self platformAttributes;
+		yourself
+!
+
+defaultPlatformAttributes
+
+	^ MetacelloPlatform current defaultPlatformAttributes
+!
+
+excludeFromLatestVersion
+
+	^#(development broken baseline)
+!
+
+lookupVersion: aVersionString ifAbsent: aBlock
+    "please use version:...this is a private method"
+
+    ^ self map
+        at: aVersionString
+        ifAbsent: [ 
+            (MetacelloVersionDefinitionError project: self project versionString: aVersionString)
+                exception: (self errorMap at: aVersionString ifAbsent: [ ^ aBlock value ]);
+                raise ]
+
+    "Modified: / 19-09-2012 / 02:14:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+platformAttributes
+
+	 ^self projectPlatformAttributes
+!
+
+pragmaKeywords
+
+	^#(version:attribute: blessing:attribute: description:attribute: required:attribute: groups:attribute: doits:attribute:)
+!
+
+projectAttributes
+
+	projectAttributes ~~ nil ifTrue: [ ^projectAttributes ].
+	^#()
+!
+
+projectAttributes: aList
+
+	projectAttributes := aList
+!
+
+projectPlatformAttributes
+
+	| list aBlock |
+	list := OrderedCollection new.
+	(aBlock := self projectAttributes) ~~ nil 
+		ifTrue: [ list addAll: aBlock value ].
+	^self defaultPlatformAttributes, list
+!
+
+sortedAndFilteredVersions
+
+		^(self map values asArray sort: [:a :b | a >= b ]) select: [:vrsn | (#(broken baseline) includes: vrsn blessing) not ].
+! !
+
+!MetacelloProject methodsFor:'scripting'!
+
+projectForScriptEngine: aMetacelloScriptEngine
+    ^ self projectForScriptEngine: aMetacelloScriptEngine unconditionalLoad: false
+!
+
+projectForScriptEngine: aMetacelloScriptEngine unconditionalLoad: aBool
+    ^ self subclassResponsibility
+! !
+
+!MetacelloProject methodsFor:'spec classes'!
+
+baselineOfProjectSpec
+    ^ self baselineOfProjectSpecClass for: self
+!
+
+baselineOfProjectSpecClass
+    ^ self subclassResponsibility
+!
+
+baselineOfVersionSpecClass
+    ^ self subclassResponsibility
+!
+
+configurationOfProjectSpec
+    ^ self configurationOfProjectSpecClass for: self
+!
+
+configurationOfProjectSpecClass
+    ^ self subclassResponsibility
+!
+
+defaultLoaderClass
+
+	^MetacelloSpecLoader
+!
+
+groupSpec
+
+	^self groupSpecClass for: self
+!
+
+groupSpecClass
+
+	^MetacelloGroupSpec
+!
+
+loader
+
+	^loader
+!
+
+loader: aLoader
+
+	loader := aLoader
+!
+
+loaderClass
+
+	loaderClass == nil ifTrue: [ loaderClass := self defaultLoaderClass ].
+	^loaderClass
+!
+
+loaderClass: aMetacelloSpecLoader
+
+	loaderClass := aMetacelloSpecLoader
+!
+
+packagesSpec
+
+	^self packagesSpecClass for: self
+!
+
+packagesSpecClass
+
+	^MetacelloPackagesSpec
+!
+
+projectReferenceSpec
+
+	^self projectReferenceSpecClass for: self
+!
+
+projectReferenceSpecClass
+
+	^MetacelloProjectReferenceSpec
+!
+
+projectSpec
+
+	^self projectSpecClass for: self
+!
+
+projectSpecClass
+    ^ MetacelloProjectSpec
+!
+
+valueHolderSpec
+
+	^self valueHolderSpecClass for: self
+!
+
+valueHolderSpecClass
+
+	^MetacelloValueHolderSpec
+!
+
+versionSpec
+
+	^self versionSpecClass for: self
+!
+
+versionSpecClass
+
+	^MetacelloVersionSpec
+! !
+
+!MetacelloProject methodsFor:'versions'!
+
+bleedingEdge
+
+	^self version: #bleedingEdge
+!
+
+currentVersion
+	| cacheKey cv |
+	cacheKey := self configuration class.
+	^ MetacelloPlatform current
+		stackCacheFor: #currentVersion
+		at: cacheKey
+		doing: [ :cache | 
+			cv := self currentVersionAgainst: nil.
+			^ cache at: cacheKey put: cv ]
+!
+
+currentVersionAgainst: resolvedPackageAndProjectNames
+	| cacheKey |
+	cacheKey := resolvedPackageAndProjectNames isNil
+		ifTrue: [ Array with: self configuration class with: nil ]
+		ifFalse: [ Array with: self configuration class with: (resolvedPackageAndProjectNames sort: [ :a :b | a <= b ]) ].
+	^ MetacelloPlatform current
+		stackCacheFor: #currentVersionAgainst:
+		at: cacheKey
+		doing: [ :cache | 
+			| cv versions latestSomethingLoaded |
+			cv := nil.
+			versions := self sortedAndFilteredVersions.
+			versions
+				do: [ :version | 
+					| status matchBlock |
+					status := resolvedPackageAndProjectNames isNil
+						ifTrue: [ version spec isPartiallyCurrent ]
+						ifFalse: [ version spec isPartiallyCurrentAgainst: resolvedPackageAndProjectNames ].
+					matchBlock := [ :matchStatus | 
+					cv := version copy.
+					cv versionStatus: matchStatus.
+					^ cache at: cacheKey put: cv ].
+					status isAllLoadedToSpec: matchBlock.
+					status isLoadedToSpec: matchBlock.
+					status isLoadedMatchConstraints: matchBlock.
+					status
+						isSomethingLoaded: [ :matchStatus | 
+							latestSomethingLoaded isNil
+								ifTrue: [ 
+									cv := version copy.
+									cv versionStatus: matchStatus.
+									latestSomethingLoaded := cv ] ] ].
+			latestSomethingLoaded ifNotNil: [ ^ cache at: cacheKey put: latestSomethingLoaded ].
+			^ cache at: cacheKey put: nil ]
+!
+
+development
+
+	^self version: #development
+!
+
+hasVersion: versionString
+
+	self version: versionString ifAbsent: [ ^false ].
+	^true
+!
+
+lastVersion
+
+	| coll |
+	coll := (self map values asArray sort: [:a :b | a <= b ]) asOrderedCollection.
+	coll isEmpty ifTrue: [ ^nil ].
+	^coll last
+!
+
+latestVersion
+
+	| excluded |
+"	self deprecated: 'Please use #stableVersion instead.'.
+"	self flag: 'deprecate after version 1.0'.
+	excluded := self excludeFromLatestVersion.
+	^(self map values select: [:version |  
+		(excluded includes: version blessing) not ]) detectMax: [:version | version ]
+!
+
+latestVersion: blessing
+
+	^(self map values select: [:version | blessing = version blessing ]) detectMax: [:version | version ]
+!
+
+latestVersionMatching: versionPatternString
+	"Answer whether the version number of the receiver matches the given pattern string.
+
+	 A Metacello version number is made up of version sequences delimited by the characters $. and $-.
+	 The $. introduces a numeric version sequence and $- introduces an alphanumeric version sequence.
+	 
+	 A version pattern is made up of version pattern match sequences. also delimited by the characters $. 
+	 and $-.. Each pattern match sequence is tested against the corresponding version sequence of the 
+	 receiver, using the 'standard' pattern matching rules. All sequences must answer true for a match.
+	
+	 The special pattern sequence '?' is a match for the corresponding version sequence and all subsequent 
+	 version sequences. '?' as the version pattern matches all versions. No more version pattern 
+	 sequences are permitted once the '?' sequence is used. If used, it is the last version pattern
+	 sequence."
+
+	^self 
+		latestVersionMatching: versionPatternString 
+		includedBlessings: #()
+		excludedBlessings: self excludeFromLatestVersion
+!
+
+latestVersionMatching: versionPatternString excludedBlessings: excluded
+
+	^self 
+		latestVersionMatching: versionPatternString 
+		includedBlessings: #()
+		excludedBlessings: excluded
+!
+
+latestVersionMatching: versionPatternString includedBlessings: included
+
+	^self 
+		latestVersionMatching: versionPatternString 
+		includedBlessings: included
+		excludedBlessings: self excludeFromLatestVersion
+!
+
+latestVersionMatching: versionPatternString includedBlessings: included excludedBlessings: excludedBlessings
+
+	| excluded |
+	excluded := excludedBlessings asSet copy.
+	excluded removeAllFoundIn: included.
+	^(self map values select: [:version |
+		(included isEmpty or: [ included includes: version blessing ]) 
+			and: [ (excluded includes: version blessing) not 
+				and: [ version versionNumber match: versionPatternString ]]])
+		detectMax: [:version | version ]
+!
+
+stableVersion
+
+	^self version: #stable
+!
+
+symbolicVersionSymbols
+
+	^self symbolicVersionMap keys asArray sort: [:a :b | a <= b ]
+!
+
+version: aVersionString
+    aVersionString isSymbol
+        ifTrue: [ 
+            | symbolicVersionString |
+            symbolicVersionString := self symbolicVersionMap
+                at: aVersionString
+                ifAbsent: [ (MetacelloSymbolicVersionDoesNotExistError project: self project versionString: aVersionString) raiseSignal ].
+            symbolicVersionString == #'notDefined'
+                ifTrue: [ (MetacelloSymbolicVersionNotDefinedError project: self project versionString: aVersionString) raiseSignal ].
+            ^ self
+                lookupVersion: symbolicVersionString
+                ifAbsent: [ (MetacelloSymbolicVersionDoesNotExistError project: self project versionString: symbolicVersionString) raiseSignal ] ].
+    ^ self
+        lookupVersion: aVersionString
+        ifAbsent: [ (MetacelloVersionDoesNotExistError project: self project versionString: aVersionString) raiseSignal ]
+
+    "Modified: / 02-10-2012 / 23:33:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+version: aVersionString ifAbsent: aBlock
+
+	^[ self version: aVersionString ] on: MetacelloVersionDoesNotExistError do: [:ex | aBlock value ].
+!
+
+versionNumberClass
+    versionNumberClass ifNil: [ versionNumberClass := MetacelloVersionNumber ].
+    ^ versionNumberClass
+!
+
+versionNumberClass: aClass
+    versionNumberClass := aClass
+!
+
+versions
+
+	^self map values asArray sort: [:a :b | a <= b ]
+! !
+
+!MetacelloProject class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectReferenceSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,185 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractPackageSpec subclass:#MetacelloProjectReferenceSpec
+	instanceVariableNames:'projectReference'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloProjectReferenceSpec methodsFor:'accessing'!
+
+answers: aListOfPairs
+
+	self shouldNotImplement
+!
+
+includes: aCollection
+
+	self shouldNotImplement
+!
+
+projectLabel
+    ^ self projectReference projectLabel
+!
+
+projectName
+	^self projectReference name
+!
+
+projectReference: anObject
+	projectReference := anObject
+!
+
+referencedSpec
+
+	^self projectReference
+!
+
+requires: aCollection
+
+	self shouldNotImplement
+!
+
+versionString
+    ^projectReference versionString
+
+    "Created: / 18-09-2012 / 19:14:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'copying'!
+
+postCopy
+
+	super postCopy.
+	projectReference := projectReference copy.
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'importing'!
+
+mergeImportLoads: aLoadList
+    self projectReference mergeImportLoads: aLoadList
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'loading'!
+
+repositorySpecs
+
+	^self repositories map values
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'merging'!
+
+aboutToCopy
+    self projectReference className
+!
+
+mergeMap
+
+	| map |
+	map := super mergeMap.
+	map at: #projectReference put: projectReference.
+	^map
+!
+
+mergeSpec: anotherSpec
+
+	| newSpec map anotherProjectReference |
+	newSpec := super mergeSpec: anotherSpec.
+	map := anotherSpec mergeMap.
+	(anotherProjectReference := map at: #projectReference) ~~ nil
+		ifTrue: [ 
+			newSpec projectReference: 
+				(newSpec projectReference == nil
+					ifTrue: [ anotherProjectReference ]
+					ifFalse: [ newSpec projectReference mergeSpec: anotherProjectReference ])].
+	^newSpec
+!
+
+nonOverridable
+
+	^super nonOverridable, #( projectReference )
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'printing'!
+
+configMethodCascadeOn: aStream member: aMember last: lastCascade indent: indent
+    aMember methodUpdateSelector == #'remove:'
+        ifTrue: [ aStream nextPutAll: 'removeProject: ' , self name printString ]
+        ifFalse: [ 
+            self projectReference == nil
+                ifTrue: [ ^ self ].
+            aStream nextPutAll: self projectLabel , ': ' , self projectName printString , ' '.
+            (aMember methodUpdateSelector == #'copy:' and: [ self projectReference hasNonVersionStringField ])
+                ifTrue: [ aStream nextPutAll: 'copyFrom: ' , aMember sourceName printString , ' ' ].
+            self projectReference configShortCutMethodOn: aStream member: aMember indent: indent + 1 ].
+    lastCascade
+        ifTrue: [ aStream nextPut: $. ]
+        ifFalse: [ 
+            aStream
+                nextPut: $;;
+                cr ]
+!
+
+configMethodOn: aStream indent: indent
+
+	aStream 
+		tab: indent; nextPutAll: 'spec '; cr;
+		tab: indent + 1; nextPutAll: 'name: ', self name printString; nextPut: $;; cr;
+		tab: indent + 1; nextPutAll: 'projectReference: '; nextPut: $[; cr.
+	aStream 
+		tab: indent + 2; nextPutAll: 'spec'.
+	self projectReference ifNotNil: [ self projectReference configMethodBodyOn: aStream indent: indent + 2].
+	aStream nextPutAll: ' ].'
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'querying'!
+
+projectReference
+	^ projectReference
+!
+
+relativeCurrentVersion
+
+	^self projectReference relativeCurrentVersion
+!
+
+repositories
+    ^ self referencedSpec repositories
+!
+
+version
+
+	^self projectReference version
+!
+
+versionOrNil
+
+	^self projectReference versionOrNil
+!
+
+versionString: aString
+
+	^self projectReference versionString: aString
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'testing'!
+
+hasRepository
+    ^ self projectReference hasRepository
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'visiting'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+
+	projectBlock value: self
+! !
+
+!MetacelloProjectReferenceSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectRegistration.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,476 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloProjectRegistration
+	instanceVariableNames:'projectName configurationProjectSpec baselineProjectSpec
+		loadedInImage locked mutable'
+	classVariableNames:'Registry'
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloProjectRegistration class methodsFor:'instance creation'!
+
+fromMCBaselineProjectSpec: aProjectSpec
+    ^ self new
+        projectName: aProjectSpec name;
+        baselineProjectSpec: aProjectSpec;
+        yourself
+!
+
+fromMCConfigurationProjectSpec: aProjectSpec
+    ^ self new
+        projectName: aProjectSpec name;
+        configurationProjectSpec: aProjectSpec;
+        yourself
+! !
+
+!MetacelloProjectRegistration class methodsFor:'accessing'!
+
+baselineClasses
+    "Return a set of the Metacello baseline classes that have been loaded into the image."
+
+    "self baselineClasses"
+
+    ^ BaselineOf allSubclasses
+!
+
+baselineProjectSpecs
+    "MetacelloProjectRegistration baselineProjectSpecs"
+
+    ^ self registry baselineProjectSpecs
+!
+
+configurationClasses
+    "Return a set of the Metacello configuration classes that have been loaded into the image."
+
+    "self configurationClasses"
+
+    | answer |
+    answer := IdentitySet new.
+    ConfigurationOf allSubclasses
+        do: [ :cl | 
+            (cl == BaselineOf or: [ cl inheritsFrom: BaselineOf ])
+                ifFalse: [ answer add: cl ] ].
+    Object allSubclasses
+        do: [ :cl | 
+            (answer includes: cl)
+                ifFalse: [ 
+                    (([ cl isMetacelloConfig ]
+                        on: Error
+                        do: [ :ex | ex return: false ]) and: [ cl name asString beginsWith: 'ConfigurationOf' ])
+                        ifTrue: [ answer add: cl ] ] ].
+    ^ answer
+!
+
+configurationProjectSpecs
+    "MetacelloProjectRegistration configurationProjectSpecs"
+
+    ^ self registry configurationProjectSpecs
+!
+
+primeRegistryFromImage
+    "MetacelloProjectRegistration primeRegistryFromImage"
+
+    self registry primeRegistryFromImage
+!
+
+projectSpecs
+    "MetacelloProjectRegistration projectSpecs"
+
+    ^ self configurationProjectSpecs , self baselineProjectSpecs
+!
+
+registry
+    Registry ifNil: [ Registry := MetacelloProjectRegistry new ].
+    ^ Registry
+!
+
+registry: aMetacelloProjectRegistry
+    Registry := aMetacelloProjectRegistry
+!
+
+resetRegistry
+    Registry := nil
+! !
+
+!MetacelloProjectRegistration class methodsFor:'mutability'!
+
+copyRegistryRestoreOnErrorWhile: aBlock
+    "install copy of registry for duration of <aBlock> execution."
+
+    "registrations will be copied on write during <aBlock> execution."
+
+    "if <aBlock> does not return control to this context, revert to the original
+	version of the registry. Otherwise leave the new copy installed."
+
+    | oldRegistry newRegistry |
+    oldRegistry := self registry.
+    newRegistry := self registry copy.
+    self registry: newRegistry.
+    aBlock
+        ensure: [ 
+            "install old version of registry"
+            self registry: oldRegistry ].
+    self registry: newRegistry	"if control returned, install newRegistry"
+!
+
+copyRegistryWhile: aBlock
+    "install copy of registry for duration of <aBlock> execution."
+
+    "registrations will be copied on write during <aBlock> execution."
+
+    "Unconditionally revert to the original
+	version of the registry. Otherwise leave the new copy installed."
+
+    | oldRegistry newRegistry |
+    oldRegistry := self registry.
+    newRegistry := self registry copy.
+    self registry: newRegistry.
+    aBlock
+        ensure: [ 
+            "install old version of registry"
+            self registry: oldRegistry ]
+! !
+
+!MetacelloProjectRegistration class methodsFor:'querying'!
+
+projectSpecForClassNamed: aClassName ifAbsent: absentBlock
+    ^ self registry projectSpecForClassNamed: aClassName ifAbsent: absentBlock
+!
+
+registrationForClassNamed: aClassName ifAbsent: absentBlock
+    ^ self registry registrationForClassNamed: aClassName ifAbsent: absentBlock
+!
+
+registrationForProjectSpec: aProjectSpec ifAbsent: absentBlock ifPresent: presentBlock
+    | newRegistration |
+    newRegistration := aProjectSpec asProjectRegistration.
+    self registry
+        registrationFor: newRegistration
+        ifPresent: [ :existing | ^ presentBlock value: existing value: newRegistration ]
+        ifAbsent: [ ^ absentBlock value: newRegistration ]
+! !
+
+!MetacelloProjectRegistration class methodsFor:'registration'!
+
+registerProjectSpec: aProjectSpec ifPresent: presentBlock
+    | newRegistration |
+    newRegistration := aProjectSpec asProjectRegistration.
+    ^ self registry
+        registrationFor: newRegistration
+        ifPresent: [ :existing | presentBlock value: existing value: newRegistration ]
+        ifAbsent: [ newRegistration registerProject ]
+! !
+
+!MetacelloProjectRegistration methodsFor:'accessing'!
+
+baseName
+    ^ MetacelloScriptEngine baseNameOf: (configurationProjectSpec ifNil: [ baselineProjectSpec ]) className
+!
+
+baselineProjectSpec
+	^ baselineProjectSpec
+!
+
+baselineProjectSpec: anObject
+    self shouldBeMutable.
+    baselineProjectSpec := anObject
+!
+
+baselineProjectSpecIfAbsent: absentBlock
+    ^ baselineProjectSpec ifNil: absentBlock
+!
+
+baselineProjectSpecIfPresent: presentBlock ifAbsent: absentBlock
+     ^ baselineProjectSpec ifNotNil: [ presentBlock cull: baselineProjectSpec ]  ifNil: absentBlock
+!
+
+configurationProjectSpec
+	^ configurationProjectSpec
+!
+
+configurationProjectSpec: anObject
+    self shouldBeMutable.
+    configurationProjectSpec := anObject
+!
+
+configurationProjectSpecIfAbsent: absentBlock
+    ^ configurationProjectSpec ifNil: absentBlock
+!
+
+configurationProjectSpecIfPresent: presentBlock ifAbsent: absentBlock
+    ^ configurationProjectSpec ifNotNil: [ presentBlock cull: configurationProjectSpec ]  ifNil: absentBlock
+!
+
+loadedInImage
+    loadedInImage ifNil: [ loadedInImage := false ].
+    ^ loadedInImage
+!
+
+loadedInImage: anObject
+    self shouldBeMutable.
+    loadedInImage := anObject
+!
+
+locked
+    locked ifNil: [ locked := false ].
+    ^ locked
+!
+
+locked: anObject
+    self shouldBeMutable.
+    locked := anObject
+!
+
+projectName
+	^ projectName
+!
+
+projectName: anObject
+    self shouldBeMutable.
+    projectName := anObject
+!
+
+repositoryDescriptions
+    ^ (self configurationProjectSpecIfAbsent: [ self baselineProjectSpec ]) repositoryDescriptions
+!
+
+version
+    ^ (self configurationProjectSpecIfAbsent: [ ^ MetacelloMCBaselineProject singletonVersionName ]) versionString
+! !
+
+!MetacelloProjectRegistration methodsFor:'comparision'!
+
+= aRegistration
+    aRegistration class == self class
+        ifFalse: [ ^ false ].
+    ^ (configurationProjectSpec registrationsCompareEqual: aRegistration configurationProjectSpec)
+        and: [ baselineProjectSpec registrationsCompareEqual: aRegistration baselineProjectSpec ]
+!
+
+hash
+    ^ ((String stringHash: projectName initialHash: 0) bitXor: configurationProjectSpec metacelloRegistrationHash)
+        bitXor: baselineProjectSpec metacelloRegistrationHash
+! !
+
+!MetacelloProjectRegistration methodsFor:'copying'!
+
+postCopy
+    super postCopy.
+    mutable := nil
+! !
+
+!MetacelloProjectRegistration methodsFor:'lookup'!
+
+lookupBaselineSpec
+    | spec |
+
+    spec := baselineProjectSpec ifNotNil: [ ^ spec ].
+    ^ configurationProjectSpec
+!
+
+lookupConfigurationSpec
+    | spec |
+
+    spec := configurationProjectSpec ifNotNil: [ ^ spec ].
+    ^ baselineProjectSpec
+!
+
+lookupSpec: aProjectSpec
+    | spec |
+    
+    (spec := self configurationProjectSpec)
+        ifNotNil: [ 
+            spec className = aProjectSpec className
+                ifTrue: [ ^ spec ] ].
+    (spec := self baselineProjectSpec)
+        ifNotNil: [ 
+            spec className = aProjectSpec className
+                ifTrue: [ ^ spec ] ].
+    ^ nil
+! !
+
+!MetacelloProjectRegistration methodsFor:'merging'!
+
+merge: aProjectRegistration
+    "should only be called from MetacelloProjectRegistration class>>mergeRegistration:with: ... merge is done when a spec has been loaded into the image"
+
+    "nil specs are ignored in the merge, otherwise aProjectRegistration specs win"
+
+    "(self hasMergeConflicts: aProjectRegistration)
+        ifTrue: [ ^ self error: 'Attempt to merge registrations with conflicts' ]."
+
+    self shouldBeMutable.
+    configurationProjectSpec
+        ifNil: [ configurationProjectSpec := aProjectRegistration configurationProjectSpec ]
+        ifNotNil: [ 
+            aProjectRegistration configurationProjectSpec
+                ifNotNil: [ configurationProjectSpec := aProjectRegistration configurationProjectSpec ] ].
+    baselineProjectSpec
+        ifNil: [ baselineProjectSpec := aProjectRegistration baselineProjectSpec ]
+        ifNotNil: [ aProjectRegistration baselineProjectSpec ifNotNil: [ baselineProjectSpec := aProjectRegistration baselineProjectSpec ] ]
+! !
+
+!MetacelloProjectRegistration methodsFor:'mutability'!
+
+copyOnWrite: aBlock
+    "assume that only registered projects are immutable ... otherwise you'll get an error"
+
+    | copy |
+    self class registry
+        registrationFor: self
+        ifPresent: [ :existing |  ]
+        ifAbsent: [ 
+            aBlock value: self.
+            ^ self ].
+    self unregisterProject.
+    copy := self copy.
+    aBlock value: copy.
+    copy registerProject.
+    ^ copy
+!
+
+immutable
+    mutable := false
+!
+
+isMutable
+    mutable ifNil: [ ^ true ].
+    ^ mutable
+!
+
+mutable
+    mutable := true
+!
+
+shouldBeMutable
+    self isMutable
+        ifTrue: [ ^ self ].
+    self error: 'Not allowed to modify an immutable object'
+! !
+
+!MetacelloProjectRegistration methodsFor:'printing'!
+
+printOn: aStream
+    | label versionString descriptions |
+    self
+        configurationProjectSpecIfPresent: [ :spec | 
+            label := spec className.
+            versionString := spec versionString ]
+        ifAbsent: [ 
+            "baseline"
+            label := self baselineProjectSpec className.
+            versionString := '[baseline]' ].
+    aStream
+        nextPutAll: label;
+        space;
+        nextPutAll: versionString.
+    (descriptions := self repositoryDescriptions) isEmpty
+        ifTrue: [ ^ self ].
+    aStream nextPutAll: ' from '.
+    descriptions size = 1
+        ifTrue: [ aStream nextPutAll: descriptions first ]
+        ifFalse: [ 
+            aStream nextPut: ${.
+            descriptions do: [ :description | aStream nextPutAll: description ].
+            aStream nextPut: $} ]
+! !
+
+!MetacelloProjectRegistration methodsFor:'querying'!
+
+currentlyLoadedClassesInProject
+    | classes |
+    classes := Set new.
+    self
+        configurationProjectSpecIfPresent: [ :spec | classes addAll: spec currentlyLoadedClassesInVersion ]
+        ifAbsent: [  ].
+    self baselineProjectSpecIfPresent: [ :spec | classes addAll: spec currentlyLoadedClassesInVersion ] ifAbsent: [  ].
+    ^ classes
+! !
+
+!MetacelloProjectRegistration methodsFor:'registration'!
+
+registerProject
+    "unconditionally register <newRegistration> ... use with care"
+
+    self class registry registerProjectRegistration: self
+!
+
+unregisterProject
+    self class registry unregisterProjectRegistration: self
+! !
+
+!MetacelloProjectRegistration methodsFor:'testing'!
+
+canDowngradeTo: aProjectRegistration
+    "true if there are no load conflicts
+        OR
+       if the load conflicts involved two cofigurations ONLY and a downgrade is allowed"
+
+    (self hasLoadConflicts: aProjectRegistration)
+        ifFalse: [ ^ true ].
+    configurationProjectSpec
+        ifNotNil: [ 
+            aProjectRegistration configurationProjectSpec
+                ifNotNil: [ 
+                    configurationProjectSpec ensureProjectLoaded.
+                    ^ configurationProjectSpec canDowngradeTo: aProjectRegistration configurationProjectSpec ] ].
+    ^ false
+!
+
+canUpgradeTo: aProjectRegistration
+    "true if there are no load conflicts
+        OR
+       if the load conflicts involved two cofigurations ONLY and an upgrade is allowed"
+
+    (self hasLoadConflicts: aProjectRegistration)
+        ifFalse: [ ^ true ].
+    configurationProjectSpec
+        ifNotNil: [ 
+            aProjectRegistration configurationProjectSpec
+                ifNotNil: [ 
+                    configurationProjectSpec copy ensureProjectLoaded.
+                    ^ configurationProjectSpec canUpgradeTo: aProjectRegistration configurationProjectSpec ] ].
+    ^ false
+!
+
+hasLoadConflicts: aProjectRegistration
+    "5 combinations of loads with no load conflicts:
+        No configs and baselines =
+        configs = and no baselines
+        configs = and baselines =
+        configs = and no baseline loaded (self) with a baseline to load (aProjectRegistration)
+        config loaded (self), no config to load (aProjectRegistration) and no baseline loaded(self) with a baseline to load (aProjectRegistration) "
+
+    self isValid
+        ifFalse: [ self error: 'Invalid projectRegistration: ' , self printString ].
+    aProjectRegistration isValid
+        ifFalse: [ self error: 'Invalid projectRegistration: ' , aProjectRegistration printString ].
+    configurationProjectSpec
+        ifNil: [ 
+            aProjectRegistration configurationProjectSpec notNil
+                ifTrue: [ ^ true ] ]
+        ifNotNil: [ 
+            aProjectRegistration configurationProjectSpec
+                ifNotNil: [ 
+                    (aProjectRegistration configurationProjectSpec registrationsCompareEqual: configurationProjectSpec) not
+                        ifTrue: [ ^ true ] ] ].
+    ^ baselineProjectSpec
+        ifNil: [ false ]
+        ifNotNil: [ (baselineProjectSpec registrationsCompareEqual: aProjectRegistration baselineProjectSpec) not ]
+!
+
+isValid
+    " has a name and one or the other of the projectSpecs is non-nil"
+
+    projectName ifNil: [ ^ false ].
+    ^ configurationProjectSpec notNil or: [ baselineProjectSpec notNil ]
+! !
+
+!MetacelloProjectRegistration class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectRegistry.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,189 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloProjectRegistry
+	instanceVariableNames:'baselineRegistry configurationRegistry'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloProjectRegistry methodsFor:'accessing'!
+
+baselineProjectSpecs
+    "MetacelloProjectRegistration baselineProjectSpecs"
+
+    | projectSpecs |
+    projectSpecs := OrderedCollection new.
+    self baselineRegistry
+        keysAndValuesDo: [ :className :registration | projectSpecs add: (self projectSpecForClassNamed: className ifAbsent: [ self error: 'not expected' ]) ].
+    ^ projectSpecs asArray
+!
+
+baselineRegistry
+    baselineRegistry ifNil: [ baselineRegistry := Dictionary new ].
+    ^ baselineRegistry
+!
+
+configurationProjectSpecs
+    "MetacelloProjectRegistration configurationProjectSpecs"
+
+    | projectSpecs |
+    projectSpecs := OrderedCollection new.
+    self configurationRegistry
+        keysAndValuesDo: [ :className :registration | projectSpecs add: (self projectSpecForClassNamed: className ifAbsent: [ self error: 'not expected' ]) ].
+    ^ projectSpecs asArray
+!
+
+configurationRegistry
+    configurationRegistry ifNil: [ configurationRegistry := Dictionary new ].
+    ^ configurationRegistry
+!
+
+projectSpecs
+    "MetacelloProjectRegistration projectSpecs"
+
+    ^ self configurationProjectSpecs , self baselineProjectSpecs
+! !
+
+!MetacelloProjectRegistry methodsFor:'copying'!
+
+postCopy
+    super postCopy.
+    baselineRegistry := self baselineRegistry copy.
+    configurationRegistry := self configurationRegistry copy
+! !
+
+!MetacelloProjectRegistry methodsFor:'initialization'!
+
+primeRegistryFromImage
+    "MetacelloProjectRegistration primeRegistryFromImage"
+
+    MetacelloProjectRegistration configurationClasses
+        do: [ :cl | 
+            (self configurationRegistry includesKey: cl name asString)
+                ifFalse: [ 
+                    | version |
+
+                    "not registered"
+                    (version := cl project currentVersion)
+                        ifNotNil: [ 
+                            | projectSpec |
+                            projectSpec := (version project projectSpec
+                                name: (MetacelloScriptEngine baseNameOf: cl name asString);
+                                className: cl name asString;
+                                versionString: version versionString;
+                                repositories: version project projectPackage repositories copy;
+                                yourself) asConfigurationProjectSpec.
+                            projectSpec asProjectRegistration
+                                loadedInImage: true;
+                                registerProject ] ] ].
+    MetacelloProjectRegistration baselineClasses
+        do: [ :cl | 
+            (self baselineRegistry includesKey: cl name asString)
+                ifFalse: [ 
+                    | version |
+                    "not registered"
+
+                    (version := cl project currentVersion)
+                        ifNotNil: [
+                            | projectSpec |
+                            projectSpec := (version project projectSpec
+                                name: (MetacelloScriptEngine baseNameOf: cl name asString);
+                                repositories: version project projectPackage repositories copy;
+                                yourself) asBaselineProjectSpec.
+                            projectSpec asProjectRegistration
+                                loadedInImage: true;
+                                registerProject ] ] ]
+! !
+
+!MetacelloProjectRegistry methodsFor:'querying'!
+
+projectSpecForClassNamed: aClassName ifAbsent: absentBlock
+    ^ (self configurationRegistry
+        at: aClassName
+        ifAbsent: [ ^ (self baselineRegistry at: aClassName ifAbsent: [^absentBlock value]) baselineProjectSpec ])
+        configurationProjectSpec
+!
+
+registrationForClassNamed: aClassName ifAbsent: absentBlock
+    | baseName |
+    baseName := MetacelloScriptEngine baseNameOf: aClassName.
+    self configurationRegistry at: aClassName ifPresent: [ :registration | ^ registration ].
+    self baselineRegistry at: aClassName ifPresent: [ :registration | ^ registration ].
+    self configurationRegistry at: 'ConfigurationOf' , baseName ifPresent: [ :registration | ^ registration ].
+    self baselineRegistry at: 'BaselineOf' , baseName ifPresent: [ :registration | ^ registration ].
+    ^ absentBlock value
+! !
+
+!MetacelloProjectRegistry methodsFor:'registration'!
+
+registerProjectRegistration: aMetacelloProjectRegistration
+    "unconditionally register <newRegistration> ... use with care"
+
+    | spec |
+
+    (spec := aMetacelloProjectRegistration configurationProjectSpec)
+        ifNotNil: [
+            self configurationRegistry
+                at: spec className
+                ifPresent: [ :existing | 
+                    (existing configurationProjectSpec registrationsCompareEqual: spec)
+                        ifFalse: [ 
+                            Transcript
+                                cr;
+                                show:
+                                        'REGISTRATION OF INCOMPATABLE PROJECTS: ' , existing printString , ' REPLACED BY '
+                                                , aMetacelloProjectRegistration printString ] ].
+            spec immutable.
+            self configurationRegistry at: spec className put: aMetacelloProjectRegistration ].
+    (spec := aMetacelloProjectRegistration baselineProjectSpec)
+        ifNotNil: [
+            self baselineRegistry
+                at: spec className
+                ifPresent: [ :existing | 
+                    (existing baselineProjectSpec registrationsCompareEqual: spec)
+                        ifFalse: [ 
+                            Transcript
+                                cr;
+                                show:
+                                        'REGISTRATION OF INCOMPATABLE PROJECTS: ' , existing printString , ' REPLACED BY '
+                                                , aMetacelloProjectRegistration printString ] ].
+            spec immutable.
+            self baselineRegistry at: spec className put: aMetacelloProjectRegistration ].
+    aMetacelloProjectRegistration immutable
+!
+
+registrationFor: aMetacelloProjectRegistration ifPresent: presentBlock ifAbsent: absentBlock
+    | baseName spec |
+
+    baseName := aMetacelloProjectRegistration baseName.
+    (spec := aMetacelloProjectRegistration configurationProjectSpec)
+        ifNotNil: [ self configurationRegistry at: spec className ifPresent: [ :existing | ^ presentBlock value: existing ] ].
+    (spec := aMetacelloProjectRegistration baselineProjectSpec)
+        ifNotNil: [ self baselineRegistry at: spec className ifPresent: [ :existing | ^ presentBlock value: existing ] ].
+    self configurationRegistry
+        at: 'ConfigurationOf' , baseName
+        ifPresent: [ :existing | ^ presentBlock value: existing ].
+    self baselineRegistry at: 'BaselineOf' , baseName ifPresent: [ :existing | ^ presentBlock value: existing ].
+    ^ absentBlock value
+!
+
+unregisterProjectRegistration: aMetacelloProjectRegistration
+    | spec |
+
+    (spec := aMetacelloProjectRegistration configurationProjectSpec)
+        ifNotNil: [
+            self configurationRegistry
+                removeKey: spec className
+                ifAbsent: [ self error: 'unexpectedly missing project registration' ] ].
+    (spec := aMetacelloProjectRegistration baselineProjectSpec)
+        ifNotNil: [ self baselineRegistry removeKey: spec className ifAbsent: [ self error: 'unexpectedly missing project registration' ] ]
+! !
+
+!MetacelloProjectRegistry class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,536 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloProjectSpec
+	instanceVariableNames:'name className versionString operator loads preLoadDoIt
+		postLoadDoIt'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloProjectSpec methodsFor:'accessing'!
+
+className: aString
+    self shouldBeMutable.
+    className := aString
+!
+
+file
+    ^ nil
+!
+
+getClassName
+    "raw access to iv"
+
+    ^ className
+!
+
+getFile
+    "raw access to iv"
+
+    ^ nil
+!
+
+getOperator
+
+	^operator
+!
+
+getRepositories
+    "raw access to iv"
+
+    ^ nil
+!
+
+loads: aCollection
+
+	aCollection setLoadsInMetacelloProject: self
+!
+
+name: aString
+    ((aString at: 1) isSeparator or: [ (aString at: aString size) isSeparator ])
+        ifTrue: [ self error: 'Names are not allowed to have leading or trailing blanks: ' , aString printString ].
+    self shouldBeMutable.
+    name := aString
+!
+
+operator: anObject
+    " #= #~= #> #< #>= #<= #~> "
+
+    self shouldBeMutable.
+    operator := anObject
+!
+
+postLoadDoIt: anObject
+
+	anObject setPostLoadDoItInMetacelloSpec: self
+!
+
+preLoadDoIt: anObject
+
+	anObject setPreLoadDoItInMetacelloSpec: self
+!
+
+setPostLoadDoIt: aSymbol
+    self shouldBeMutable.
+    postLoadDoIt := aSymbol
+!
+
+setPreLoadDoIt: aSymbol
+    self shouldBeMutable.
+    preLoadDoIt := aSymbol
+!
+
+versionString: anObject
+    self shouldBeMutable.
+    versionString := anObject
+! !
+
+!MetacelloProjectSpec methodsFor:'adding'!
+
+addToMetacelloPackages: aMetacelloPackagesSpec
+
+	| spec |
+	spec := (aMetacelloPackagesSpec project projectReferenceSpec)
+			name: self name;
+			projectReference: self copy;
+			yourself.
+	aMetacelloPackagesSpec addMember: 
+		(aMetacelloPackagesSpec addMember 
+			name: spec name;
+			spec: spec;
+			yourself)
+			
+! !
+
+!MetacelloProjectSpec methodsFor:'construction'!
+
+className: aString constructor: aVersionConstructor
+    aVersionConstructor classNameForProject: aString
+!
+
+loads: anObject constructor: aVersionConstructor
+    aVersionConstructor loadsForProject: anObject
+!
+
+name: aString constructor: aVersionConstructor
+    aVersionConstructor nameForProject: aString
+!
+
+operator: anObject constructor: aVersionConstructor
+    aVersionConstructor operatorForProject: anObject
+!
+
+postLoadDoIt: aSymbol constructor: aVersionConstructor
+    aVersionConstructor postLoadDoItForProject: aSymbol
+!
+
+preLoadDoIt: aSymbol constructor: aVersionConstructor
+    aVersionConstructor preLoadDoItForProject: aSymbol
+!
+
+version: anObject constructor: aVersionConstructor
+    aVersionConstructor versionForProject: anObject
+!
+
+versionString: anObject constructor: aVersionConstructor
+    aVersionConstructor versionStringForProject: anObject
+! !
+
+!MetacelloProjectSpec methodsFor:'loading'!
+
+load
+
+	self subclassResponsibility
+! !
+
+!MetacelloProjectSpec methodsFor:'merging'!
+
+mergeMap
+
+	| map |
+	map := super mergeMap.
+	map at: #name put: name.
+	map at: #className put: className.
+	map at: #versionString put: versionString.
+	map at: #operator put: operator.
+	map at: #loads put: loads.
+	map at: #preLoadDoIt put: preLoadDoIt.
+	map at: #postLoadDoIt put: postLoadDoIt.
+	^map
+! !
+
+!MetacelloProjectSpec methodsFor:'printing'!
+
+configMethodBodyOn: aStream indent: indent
+    | hasVersionString hasOperator hasProjectPackage hasLoads hasClassName hasPreLoadDoIt hasPostLoadDoIt |
+    hasClassName := self hasClassName.
+    hasVersionString := self versionString ~~ nil.
+    hasOperator := operator ~~ nil.
+    hasProjectPackage := self hasRepository or: [ hasClassName & (self getFile ~~ nil or: [ className ~= self name ]) ].
+    hasLoads := self loads ~~ nil.
+    hasPreLoadDoIt := self getPreLoadDoIt ~~ nil.
+    hasPostLoadDoIt := self getPostLoadDoIt ~~ nil.
+    hasClassName
+        ifTrue: [ 
+            hasVersionString | hasOperator | hasProjectPackage | hasLoads
+                ifTrue: [ 
+                    aStream
+                        cr;
+                        tab: indent + 1 ]
+                ifFalse: [ aStream space ].
+            aStream nextPutAll: 'className: ' , self className printString.
+            hasVersionString | hasPreLoadDoIt | hasPostLoadDoIt | hasOperator | hasLoads | hasProjectPackage
+                ifTrue: [ aStream nextPut: $; ] ].
+    hasVersionString
+        ifTrue: [ 
+            | vs |
+            hasClassName | hasOperator | hasProjectPackage | hasLoads | hasPreLoadDoIt | hasPostLoadDoIt
+                ifTrue: [ 
+                    aStream
+                        cr;
+                        tab: indent + 1 ]
+                ifFalse: [ aStream space ].
+            vs := self versionString.
+            aStream nextPutAll: 'versionString: '.
+            vs isSymbol
+                ifTrue: [ aStream nextPut: $# ].
+            aStream nextPutAll: vs asString printString.
+            hasPreLoadDoIt | hasPostLoadDoIt | hasOperator | hasProjectPackage | hasLoads
+                ifTrue: [ aStream nextPut: $; ] ].
+    hasPreLoadDoIt
+        ifTrue: [ 
+            hasClassName | hasOperator | hasProjectPackage | hasLoads | hasPreLoadDoIt
+                ifTrue: [ 
+                    aStream
+                        cr;
+                        tab: indent + 1 ]
+                ifFalse: [ aStream space ].
+            aStream nextPutAll: 'preLoadDoIt: '.
+            self preLoadDoIt value isSymbol
+                ifTrue: [ 
+                    aStream
+                        nextPut: $#;
+                        nextPutAll: self preLoadDoIt value asString printString ]
+                ifFalse: [ aStream nextPutAll: self preLoadDoIt value asString ].
+            hasPostLoadDoIt | hasOperator | hasProjectPackage | hasLoads
+                ifTrue: [ aStream nextPut: $; ] ].
+    hasPostLoadDoIt
+        ifTrue: [ 
+            hasClassName | hasOperator | hasProjectPackage | hasLoads | hasPostLoadDoIt
+                ifTrue: [ 
+                    aStream
+                        cr;
+                        tab: indent + 1 ]
+                ifFalse: [ aStream space ].
+            aStream nextPutAll: 'postLoadDoIt: '.
+            self postLoadDoIt value isSymbol
+                ifTrue: [ 
+                    aStream
+                        nextPut: $#;
+                        nextPutAll: self postLoadDoIt value asString printString ]
+                ifFalse: [ aStream nextPutAll: self postLoadDoIt value asString ].
+            hasOperator | hasProjectPackage | hasLoads
+                ifTrue: [ aStream nextPut: $; ] ].
+    hasOperator
+        ifTrue: [ 
+            hasClassName | hasVersionString | hasProjectPackage | hasLoads | hasPreLoadDoIt | hasPostLoadDoIt
+                ifTrue: [ 
+                    aStream
+                        cr;
+                        tab: indent + 1 ]
+                ifFalse: [ aStream space ].
+            aStream nextPutAll: 'operator: #' , self operator asString printString.
+            hasProjectPackage | hasLoads
+                ifTrue: [ aStream nextPut: $; ] ].
+    hasLoads
+        ifTrue: [ 
+            hasClassName | hasVersionString | hasOperator | hasProjectPackage | hasPreLoadDoIt | hasPostLoadDoIt
+                ifTrue: [ 
+                    aStream
+                        cr;
+                        tab: indent + 1 ]
+                ifFalse: [ aStream space ].
+            aStream nextPutAll: 'loads: #('.
+            self loads do: [ :str | aStream nextPutAll: str printString , ' ' ].
+            aStream nextPut: $).
+            hasProjectPackage
+                ifTrue: [ aStream nextPut: $; ] ].
+    hasProjectPackage
+        ifTrue: [ 
+            | hasName hasRepo |
+            hasRepo := self hasRepository.
+            hasName := self file ~= self className.
+            hasName
+                ifTrue: [ 
+                    hasClassName | hasVersionString | hasOperator | hasLoads | hasPreLoadDoIt | hasPostLoadDoIt
+                        ifTrue: [ 
+                            aStream
+                                cr;
+                                tab: indent + 1 ]
+                        ifFalse: [ aStream space ].
+                    aStream nextPutAll: 'file: ' , self file printString.
+                    hasRepo
+                        ifTrue: [ aStream nextPut: $; ] ].
+            hasRepo
+                ifTrue: [ 
+                    | repos |
+                    repos := self repositories map values.
+                    repos size = 1
+                        ifTrue: [ 
+                            hasClassName | hasVersionString | hasOperator | hasLoads | hasPreLoadDoIt | hasPostLoadDoIt | hasName
+                                ifTrue: [ 
+                                    aStream
+                                        cr;
+                                        tab: indent + 1 ]
+                                ifFalse: [ aStream space ].
+                            repos first configMethodCascadeOn: aStream lastCascade: true ]
+                        ifFalse: [ 
+                            aStream cr.
+                            self repositories configMethodCascadeOn: aStream indent: indent ] ] ]
+!
+
+configMethodOn: aStream indent: indent
+
+	aStream 
+		tab: indent;
+		nextPutAll: 'spec '; cr;
+		tab: indent + 1;
+		nextPutAll: 'name: ', self name printString, ';'.
+	self configMethodBodyOn: aStream indent: indent.
+	aStream nextPut: $.
+!
+
+configShortCutMethodOn: aStream member: aMember indent: indent
+    | hasVersionString hasOperator hasProjectPackage hasLoads hasClassName hasPreLoadDoIt hasPostLoadDoIt |
+    hasClassName := self hasClassName.
+    hasVersionString := self versionString ~~ nil.
+    hasOperator := operator ~~ nil.
+    hasProjectPackage := self hasRepository or: [ hasClassName & (self getFile ~~ nil or: [ className ~= self name ]) ].
+    hasLoads := self loads ~~ nil.
+    hasPreLoadDoIt := self getPreLoadDoIt ~~ nil.
+    hasPostLoadDoIt := self getPostLoadDoIt ~~ nil.
+    hasClassName | hasOperator | hasProjectPackage | hasLoads | hasPreLoadDoIt | hasPostLoadDoIt
+        ifTrue: [ 
+            (aMember methodUpdateSelector == #'copy:' or: [ aMember methodUpdateSelector == #'with:' ])
+                ifTrue: [ 
+                    aStream
+                        nextPutAll: 'with: [';
+                        cr ]
+                ifFalse: [ 
+                    aStream
+                        nextPutAll: 'overrides: [';
+                        cr ].
+            aStream
+                tab: indent;
+                nextPutAll: 'spec'.
+            self configMethodBodyOn: aStream indent: indent.
+            aStream nextPutAll: ' ]'.
+            ^ self ].
+    hasVersionString
+        ifTrue: [ 
+            | vs |
+            vs := self versionString.
+            aStream nextPutAll: 'with: '.
+            vs isSymbol
+                ifTrue: [ aStream nextPut: $# ].
+            aStream nextPutAll: vs asString printString ]
+!
+
+hasClassName
+    ^ className ~~ nil
+!
+
+label
+
+	^self name
+!
+
+projectLabel
+    ^ 'project'
+! !
+
+!MetacelloProjectSpec methodsFor:'private'!
+
+constructClassName
+    ^ nil
+!
+
+loadListForVersion: vrsn 
+
+	^ (self loads == nil
+			or: [self loads isEmpty])
+		ifTrue: [vrsn spec defaultPackageNames]
+		ifFalse: [self loads]
+!
+
+setLoads: aCollection
+    self shouldBeMutable.
+    loads := aCollection
+!
+
+setName: aStringOrNil
+    self shouldBeMutable.
+    name := aStringOrNil
+! !
+
+!MetacelloProjectSpec methodsFor:'querying'!
+
+className
+    className ifNil: [ self name ifNotNil: [ self className: self constructClassName ] ].
+    ^ className
+!
+
+currentlyLoadedClassesInVersion
+    | vrsn | 
+
+    (vrsn := self versionOrNil) ifNotNil: [ ^ vrsn currentlyLoadedClassesInVersion ].
+    ^ #()
+!
+
+getPostLoadDoIt
+
+	^postLoadDoIt
+!
+
+getPreLoadDoIt
+
+	^preLoadDoIt
+!
+
+loads
+	^ loads
+!
+
+name
+
+	^name
+!
+
+operator
+
+	operator == nil ifTrue: [ ^#>= ].
+	^ operator
+!
+
+postLoadDoIt
+
+	^postLoadDoIt
+!
+
+preLoadDoIt
+
+	^preLoadDoIt
+!
+
+projectPackage
+
+	^nil
+!
+
+version
+    self subclassResponsibility
+!
+
+versionKey
+	"suitable for using as a unique key for the receiver's version in a dictionary"
+
+	^ self version versionKey
+!
+
+versionOrNil
+
+	^[ self version ] on: MetacelloVersionDoesNotExistError do: [:ex | ^nil ].
+!
+
+versionString
+	^ versionString
+! !
+
+!MetacelloProjectSpec methodsFor:'scripting'!
+
+asProjectRegistration
+    ^ MetacelloProjectRegistration fromProjectSpec: self
+!
+
+canDowngradeTo: aMetacelloProjectSpec
+    (self className = aMetacelloProjectSpec className and: [ self operator == aMetacelloProjectSpec operator ])
+        ifFalse: [ ^ false ].
+    ^ (aMetacelloProjectSpec version perform: self operator with: self version) not
+!
+
+canUpgradeTo: aMetacelloProjectSpec
+    (self className = aMetacelloProjectSpec className and: [ self operator == aMetacelloProjectSpec operator ])
+        ifFalse: [ ^ false ].
+    ^ aMetacelloProjectSpec version perform: self operator with: self version
+!
+
+compareEqual: aMetacelloProjectSpec
+    "name className versionString operator loads preLoadDoIt postLoadDoIt"
+
+    ^ self className = aMetacelloProjectSpec className
+        and: [ 
+            self versionString = aMetacelloProjectSpec versionString
+                and: [ 
+                    self operator == aMetacelloProjectSpec operator
+                        and: [ 
+                            self loads = aMetacelloProjectSpec loads
+                                and: [ self preLoadDoIt == aMetacelloProjectSpec preLoadDoIt and: [ self postLoadDoIt == aMetacelloProjectSpec postLoadDoIt ] ] ] ] ]
+!
+
+mergeScriptLoads: aSpec
+    | otherLoads |
+
+    self shouldBeMutable.
+    (otherLoads := aSpec loads)
+        ifNotNil: [ self loads ifNil: [ loads := otherLoads ] ifNotNil: [ loads := (loads , otherLoads) asSet asArray ] ].
+    self loader: aSpec loader
+!
+
+metacelloRegistrationHash
+    "name className versionString operator loads preLoadDoIt postLoadDoIt"
+
+    | hash |
+    hash := String stringHash: name initialHash: 0.
+    hash := String stringHash: self className initialHash: hash.
+    hash := String stringHash: self versionString initialHash: hash.
+    hash := String stringHash: self operator asString initialHash: hash.
+    hash := String stringHash: self preLoadDoIt asString initialHash: hash.
+    hash := String stringHash: self postLoadDoIt asString initialHash: hash.
+    ^ hash bitXor: loads hash
+!
+
+registration
+    ^ MetacelloProjectRegistration
+        registrationForProjectSpec: self
+        ifAbsent: [ :ignored |  ]
+        ifPresent: [ :existing :new | existing ]
+!
+
+registrationsCompareEqual: aMetacelloProjectSpec
+    "name className versionString operator loads preLoadDoIt postLoadDoIt"
+
+    ^ self className = aMetacelloProjectSpec className
+        and: [ self versionString = aMetacelloProjectSpec versionString and: [ self operator == aMetacelloProjectSpec operator ] ]
+!
+
+unregisterProject
+    ^ MetacelloProjectRegistration
+        registrationForProjectSpec: self
+        ifAbsent: [  ]
+        ifPresent: [ :existing :new | existing unregisterProject ]
+! !
+
+!MetacelloProjectSpec methodsFor:'visiting'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+    projectBlock value: self
+! !
+
+!MetacelloProjectSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpecForLoad.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,119 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloProjectSpecForLoad
+	instanceVariableNames:'projectSpec useDetermineVersionForLoad overrideProjectSpec'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloProjectSpecForLoad methodsFor:'accessing'!
+
+overrideProjectSpec
+	^ overrideProjectSpec
+!
+
+overrideProjectSpec: anObject
+	overrideProjectSpec := anObject
+!
+
+projectSpec
+	^ projectSpec
+!
+
+projectSpec: anObject
+	projectSpec := anObject
+!
+
+useDetermineVersionForLoad
+    useDetermineVersionForLoad ifNil: [ useDetermineVersionForLoad := true ].
+    ^ useDetermineVersionForLoad
+!
+
+useDetermineVersionForLoad: anObject
+	useDetermineVersionForLoad := anObject
+! !
+
+!MetacelloProjectSpecForLoad methodsFor:'operations'!
+
+performCurrentVersionTestAgainst: vrsn operator: anOperator targetVersionStatus: targetVersionStatus using: anMCLoader
+    "answer true if the current state of image is to be left as is"
+
+    | currentVersion existing new |
+    vrsn ifNil: [ ^ false ].
+    self useDetermineVersionForLoad
+        ifTrue: [ 
+            | prjct cv |
+            self hasOverride
+                ifTrue: [ self error: 'unexpected logic combination: useDeterminVersionForLoad & hasOverride' ].
+            prjct := self projectSpec projectClassProject.
+            prjct loader: anMCLoader.
+            (cv := prjct currentVersion) == nil
+                ifTrue: [ ^ false ].
+            (targetVersionStatus includes: cv versionStatus)
+                ifTrue: [ ^ cv perform: anOperator with: vrsn ].
+            ^ false ].
+    (self hasOverride not or: [ targetVersionStatus ~= #(#'allLoadedToSpec') ])
+        ifTrue: [ ^ false ].
+    (self overrideProjectSpec allPackagesLoaded: anMCLoader)
+        ifFalse: [ 
+            "roughly equivalent to versionStatus test above (#'allLoadedToSpec')"
+            ^ false ].
+    (currentVersion := self overrideProjectSpec versionOrNil) ifNil: [ ^ false ].
+    currentVersion = vrsn
+        ifTrue: [ ^ true ].
+    existing := self overrideProjectSpec asProjectRegistration.
+    new := self projectSpec asProjectRegistration.
+    ^ currentVersion > vrsn
+        ifTrue: [ 
+            "answer false if downgrade allowed"
+            (MetacelloAllowProjectDowngrade new
+                existingProjectRegistration: existing;
+                newProjectRegistration: new;
+                raiseSignal) == existing ]
+        ifFalse: [ 
+            "answer false if upgrade allowed"
+            (MetacelloAllowProjectUpgrade new
+                existingProjectRegistration: existing;
+                newProjectRegistration: new;
+                raiseSignal) == existing ]
+
+    "Modified: / 02-10-2012 / 23:33:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+performLoad
+    | displayString spec |
+    spec := self projectSpec.
+    displayString := 'Project: ' , spec name.
+    spec versionString ~~ nil
+        ifTrue: [ displayString := displayString , ' ' , spec versionString ].
+    Transcript
+        cr;
+        show: displayString.
+    self hasOverride
+        ifTrue: [ 
+            | override |
+            override := self overrideProjectSpec copy.
+            override mergeScriptLoads: spec.
+            override loadVersion: nil ]
+        ifFalse: [ 
+            spec
+                loadVersion:
+                    (self useDetermineVersionForLoad
+                        ifTrue: [ spec determineCurrentVersionForLoad ]
+                        ifFalse: [ spec versionOrNil ]) ]
+! !
+
+!MetacelloProjectSpecForLoad methodsFor:'testing'!
+
+hasOverride
+    ^ self overrideProjectSpec ~~ nil
+! !
+
+!MetacelloProjectSpecForLoad class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpecGenerator.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,44 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloProjectSpecGenerator
+	instanceVariableNames:'target'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloProjectSpecGenerator methodsFor:'accessing'!
+
+projectSpecCreationBlock
+    ^ [ :projectName | {(MetacelloMCProject new projectSpec name: projectName)} ]
+!
+
+projectSpecListBlock
+    ^ [ MetacelloProjectRegistration projectSpecs ]
+!
+
+projectSpecLookupBlock
+    ^ [ :projectName | 
+    {(MetacelloProjectRegistration
+        projectSpecForClassNamed: (MetacelloScriptEngine baselineNameFrom: projectName)
+        ifAbsent: [  ]).
+    (MetacelloProjectRegistration
+        projectSpecForClassNamed: (MetacelloScriptEngine configurationNameFrom: projectName)
+        ifAbsent: [  ])} ]
+!
+
+target
+	^ target
+!
+
+target: anObject
+	target := anObject
+! !
+
+!MetacelloProjectSpecGenerator class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpecLoadConflict.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,38 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloProjectSpecLoadError subclass:#MetacelloProjectSpecLoadConflict
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloProjectSpecLoadConflict methodsFor:'accessing'!
+
+possibleVersions
+    "not applicable to a Conflict error"
+
+    self shouldNotImplement
+!
+
+versionString
+    "not applicable to a Conflict error"
+
+    self shouldNotImplement
+! !
+
+!MetacelloProjectSpecLoadConflict methodsFor:'private'!
+
+isResumable
+	"Determine whether an exception is resumable."
+
+	^ true
+! !
+
+!MetacelloProjectSpecLoadConflict class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpecLoadError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,61 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloProjectSpecLoadError
+	instanceVariableNames:'projectSpec versionDoesNotExistException'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloProjectSpecLoadError class methodsFor:'instance creation'!
+
+projectSpec: aMetacelloMCProjectSpec
+
+	^self new
+		projectSpec: aMetacelloMCProjectSpec;
+		yourself
+! !
+
+!MetacelloProjectSpecLoadError methodsFor:'accessing'!
+
+possibleVersions
+    ^ self versionDoesNotExistException possibleVersions
+!
+
+projectSpec
+
+	^projectSpec
+!
+
+projectSpec: aMetacelloMCProjectSpec
+
+	projectSpec := aMetacelloMCProjectSpec
+!
+
+versionDoesNotExistException
+	^ versionDoesNotExistException
+!
+
+versionDoesNotExistException: anObject
+	versionDoesNotExistException := anObject
+!
+
+versionString
+    ^ self versionDoesNotExistException versionString
+! !
+
+!MetacelloProjectSpecLoadError methodsFor:'private'!
+
+isResumable
+	"Determine whether an exception is resumable."
+
+	^ false
+! !
+
+!MetacelloProjectSpecLoadError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpecLoadedNotification.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,28 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptProjectSpecNotification subclass:#MetacelloProjectSpecLoadedNotification
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloProjectSpecLoadedNotification methodsFor:'exception description'!
+
+defaultAction
+    ^ nil
+! !
+
+!MetacelloProjectSpecLoadedNotification methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+    ^ aScriptEngine handleProjectSpecLoaded: self
+! !
+
+!MetacelloProjectSpecLoadedNotification class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloRemoveMemberSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,35 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMemberSpec subclass:#MetacelloRemoveMemberSpec
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Members'
+!
+
+
+!MetacelloRemoveMemberSpec methodsFor:'accessing'!
+
+methodUpdateSelector
+
+	^#remove:
+! !
+
+!MetacelloRemoveMemberSpec methodsFor:'actions'!
+
+applyAdd: addBlock copy: copyBlock merge: mergeBlock remove: removeBlock
+
+	removeBlock value: self
+!
+
+applyToList: aListSpec
+
+	aListSpec remove: self
+! !
+
+!MetacelloRemoveMemberSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloResolveProjectUpgrade.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,78 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptNotification subclass:#MetacelloResolveProjectUpgrade
+	instanceVariableNames:'existingProjectRegistration newProjectRegistration'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloResolveProjectUpgrade methodsFor:'accessing'!
+
+existingProjectRegistration
+	^ existingProjectRegistration
+!
+
+existingProjectRegistration: anObject
+	existingProjectRegistration := anObject
+!
+
+newProjectRegistration
+	^ newProjectRegistration
+!
+
+newProjectRegistration: anObject
+	newProjectRegistration := anObject
+!
+
+operationString
+    self subclassResponsibility
+! !
+
+!MetacelloResolveProjectUpgrade methodsFor:'exception handling'!
+
+allow
+    self checkAllowed.
+    self resume: self newProjectRegistration
+!
+
+allowEvenIfLocked
+    self resume: self newProjectRegistration
+!
+
+defaultAction
+    "Result of signal should be the projectRegistration to be used to perform the load ... default is to disallow"
+
+    ^ self existingProjectRegistration
+!
+
+disallow
+    "default action"
+
+    self resume: self existingProjectRegistration
+! !
+
+!MetacelloResolveProjectUpgrade methodsFor:'handlers'!
+
+handleOnDownGrade: onDownGradeBlock onUpgrade: onUpgradeBlock
+    self subclassResponsibility
+! !
+
+!MetacelloResolveProjectUpgrade methodsFor:'private'!
+
+checkAllowed
+    self existingProjectRegistration locked
+        ifTrue: [ 
+            MetacelloLockedProjectError
+                signal:
+                    'Attempt to perform' , self operationString printString , ' a locked project: '
+                        , self existingProjectRegistration printString ]
+! !
+
+!MetacelloResolveProjectUpgrade class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptApiExecutor.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,53 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptExecutor subclass:#MetacelloScriptApiExecutor
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptApiExecutor methodsFor:'execution callback'!
+
+executeBlock: selectBlock do: projectSpecBlock
+    (self projectSpecsFromRepositoryArg select: selectBlock)
+        do: [ :projectSpec | projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ]
+!
+
+executeCollection: aCollection do: projectSpecBlock
+    self projectSpecsFromRepositoryArg
+        do: [ :projectSpec | 
+            (aCollection includes: (MetacelloScriptEngine baseNameOf: projectSpec className))
+                ifTrue: [ projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ] ]
+!
+
+executeString: aString do: projectSpecBlock
+    self singleRoot: true.
+    (projectSpecGenerator projectSpecCreationBlock value: aString)
+        do: [ :projectSpec | projectSpec ifNotNil: [ projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ] ]
+!
+
+projectSpecsFromRepositoryArg
+    | spec repo projectSpecs |
+    repositoryArg ifNil: [ ^ #() ].
+    spec := (projectSpecGenerator projectSpecCreationBlock value: 'xxx') first.
+    repo := spec project createRepository: (spec project repositorySpec description: repositoryArg).
+    projectSpecs := OrderedCollection new.
+    ((Gofer new disablePackageCache
+        repository: repo;
+        allResolved) collect: [ :resolvedReference | resolvedReference packageName ]) asSet
+        do: [ :packageName | 
+            (projectSpecGenerator projectSpecCreationBlock value: (MetacelloScriptEngine baseNameOf: packageName))
+                do: [ :projectSpec | 
+                    projectSpec className = packageName
+                        ifTrue: [ projectSpecs add: (self applyArgsToProjectSpec: projectSpec copy) ] ] ].
+    ^ projectSpecs
+! !
+
+!MetacelloScriptApiExecutor class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptEngine.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,464 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloScriptEngine
+	instanceVariableNames:'root projectSpec options'
+	classVariableNames:'DefaultRepositoryDescription DefaultVersionString'
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptEngine class methodsFor:'defaults'!
+
+defaultRepositoryDescription
+    DefaultRepositoryDescription
+        ifNil: [ DefaultRepositoryDescription := MetacelloPlatform current defaultRepositoryDescription ].
+    ^ DefaultRepositoryDescription
+!
+
+defaultVersionString
+    DefaultVersionString ifNil: [ DefaultVersionString := #'stable' ].
+    ^ DefaultVersionString
+! !
+
+!MetacelloScriptEngine class methodsFor:'utility'!
+
+baseNameOf: className
+    ^ (className indexOfSubCollection: 'BaselineOf') = 0
+        ifTrue: [ 
+            (className indexOfSubCollection: 'ConfigurationOf') = 0
+                ifTrue: [ className ]
+                ifFalse: [ className copyFrom: 'ConfigurationOf' size + 1 to: className size ] ]
+        ifFalse: [ className copyFrom: 'BaselineOf' size + 1 to: className size ]
+!
+
+baselineNameFrom: baseName
+    "Return the fully-qualified configuration class name."
+
+    ^ (baseName indexOfSubCollection: 'BaselineOf') > 0
+        ifTrue: [ baseName ]
+        ifFalse: [ 'BaselineOf' , baseName ]
+!
+
+baselineProjectNameOf: baselineClassName
+    ^ (baselineClassName indexOfSubCollection: 'BaselineOf') = 0
+        ifTrue: [ baselineClassName ]
+        ifFalse: [ baselineClassName copyFrom: 'BaselineOf' size + 1 to: baselineClassName size ]
+!
+
+configurationNameFrom: baseName
+    "Return the fully-qualified configuration class name."
+
+    ^ (baseName indexOfSubCollection: 'ConfigurationOf') > 0
+        ifTrue: [ baseName ]
+        ifFalse: [ 'ConfigurationOf' , baseName ]
+!
+
+configurationProjectNameOf: configurationClassName
+    ^ (configurationClassName indexOfSubCollection: 'ConfigurationOf') = 0
+        ifTrue: [ configurationClassName ]
+        ifFalse: [ configurationClassName copyFrom: 'ConfigurationOf' size + 1 to: configurationClassName size ]
+! !
+
+!MetacelloScriptEngine methodsFor:'accessing'!
+
+options
+    options ifNil: [ options := Dictionary new ].
+    ^ options
+!
+
+options: aDictionary
+    options := aDictionary
+!
+
+projectName
+    ^ self projectSpec name
+!
+
+projectSpec
+    ^ projectSpec
+!
+
+projectSpec: aProjectSpec
+    projectSpec := aProjectSpec
+!
+
+repositories
+    ^ self projectSpec repositories
+!
+
+root
+	^ root
+!
+
+root: anObject
+	root := anObject
+! !
+
+!MetacelloScriptEngine methodsFor:'actions api'!
+
+fetch: required
+    self
+        fetchRecord: [ :version | 
+            required isEmpty
+                ifTrue: [ version fetch ]
+                ifFalse: [ version fetch: required ] ]
+        required: required
+!
+
+fetchRecord: fetchRecordBlock required: required
+    MetacelloProjectRegistration
+        copyRegistryWhile: [ 
+            self
+                handleNotificationsForAction: [ 
+                    | version loadedSpec |
+                    self validateProjectSpecForScript.
+                    [ loadedSpec := self lookupProjectSpecFor: self projectSpec ]
+                        on: MetacelloAllowProjectDowngrade , MetacelloAllowProjectUpgrade
+                        do: [ :notification | 
+                            notification
+                                handleOnDownGrade: [ :ex :existing :new | ex allowEvenIfLocked ]
+                                onUpgrade: [ :ex :existing :new | ex allowEvenIfLocked ] ].
+                    version := loadedSpec versionForScriptEngine: self.
+                    self root: (fetchRecordBlock value: version) loadDirective ] ]
+!
+
+get
+    " load a fresh copy from repo"
+
+    | spec projectPackage |
+    MetacelloProjectRegistration
+        copyRegistryRestoreOnErrorWhile: [ 
+            self validateProjectSpecForScript.
+            spec := self projectSpec.
+            projectPackage := spec projectPackage.
+            projectPackage repositorySpecs do: [ :repoSpec | repoSpec createRepository flushForScriptGet ].
+            projectPackage load.
+            self root: (Smalltalk at: spec className asSymbol) project.
+            MetacelloProjectRegistration
+                registrationForProjectSpec: spec
+                ifAbsent: [ :new | new registerProject ]
+                ifPresent: [ :existing :new | 
+                    existing
+                        copyOnWrite: [ :existingCopy | 
+                            spec
+                                copyForRegistration: existingCopy
+                                onWrite: [ :specCopy | specCopy ifNil: [ existingCopy merge: new ] ifNotNil: [ specCopy mergeScriptRepository: spec ] ] ] ] ]
+!
+
+list
+    self validateProjectSpecForScript.
+    self root: self projectSpec
+!
+
+load: required
+    self
+        load: required
+        onProjectDownGrade: [ :ex :existing :new | ex allowEvenIfLocked ]
+        onProjectUpgrade: [ :ex :existing :new | ex allowEvenIfLocked ]
+!
+
+load: required onProjectDownGrade: onDownGradeBlock onProjectUpgrade: onUpgradeBlock
+    MetacelloProjectRegistration
+        copyRegistryRestoreOnErrorWhile: [ 
+            self
+                handleNotificationsForAction: [ 
+                    | version loadedSpec |
+                    self validateProjectSpecForScript.
+                    [ loadedSpec := self lookupProjectSpecFor: self projectSpec ]
+                        on: MetacelloAllowProjectDowngrade , MetacelloAllowProjectUpgrade
+                        do: [ :ex | ex handleOnDownGrade: onDownGradeBlock onUpgrade: onUpgradeBlock ].
+                    version := loadedSpec versionForScriptEngine: self.
+                    self
+                        root:
+                            (required isEmpty
+                                ifTrue: [ version load ]
+                                ifFalse: [ version load: required ]) loadDirective.
+                    loadedSpec loads: required.
+                    MetacelloProjectRegistration
+                        registrationForProjectSpec: loadedSpec
+                        ifAbsent: [ :new | 
+                            new
+                                loadedInImage: true;
+                                registerProject ]
+                        ifPresent: [ :existing :new | 
+                            existing
+                                copyOnWrite: [ :existingCopy | 
+                                    existingCopy
+                                        loadedInImage: true;
+                                        merge: new ] ] ] ]
+!
+
+lock
+    | spec |
+    MetacelloProjectRegistration
+        copyRegistryRestoreOnErrorWhile: [ 
+            self validateProjectSpecForScript.
+            spec := self projectSpec.
+            MetacelloProjectRegistration
+                registrationForProjectSpec: spec
+                ifAbsent: [ :new | 
+                    new
+                        locked: true;
+                        registerProject ]
+                ifPresent: [ :existing :new | 
+                    existing
+                        copyOnWrite: [ :existingCopy | 
+                            existingCopy locked: true.
+                            spec
+                                copyForRegistration: existingCopy
+                                onWrite: [ :specCopy | 
+                                    specCopy
+                                        ifNil: [ existingCopy merge: new ]
+                                        ifNotNil: [ 
+                                            specCopy mergeScriptRepository: spec.
+                                            spec := specCopy ] ] ] ].
+            self root: spec ]
+!
+
+record: required
+    self
+        fetchRecord: [ :version | 
+            required isEmpty
+                ifTrue: [ version record ]
+                ifFalse: [ version record: required ] ]
+        required: required
+!
+
+unlock
+    | spec |
+    MetacelloProjectRegistration
+        copyRegistryRestoreOnErrorWhile: [ 
+            self validateProjectSpecForScript.
+            spec := self projectSpec.
+            MetacelloProjectRegistration
+                registrationForProjectSpec: spec
+                ifAbsent: [ :ignored |  ]
+                ifPresent: [ :existing :new | existing copyOnWrite: [ :existingCopy | existingCopy locked: false ] ].
+            self root: spec ]
+! !
+
+!MetacelloScriptEngine methodsFor:'defaults'!
+
+defaultRepositoryDescription
+    ^ self class defaultRepositoryDescription
+!
+
+defaultVersionString
+    ^ self class defaultVersionString
+! !
+
+!MetacelloScriptEngine methodsFor:'handlers'!
+
+handleConflict: exception
+    ^ (self options at: #'onConflict' ifAbsent: [ ^ exception pass ])
+        cull: exception
+        cull: exception existingProjectRegistration
+        cull: exception newProjectRegistration
+!
+
+handleDowngrade: exception
+    ^ (self options at: #'onDowngrade' ifAbsent: [ ^ exception pass ])
+        cull: exception
+        cull: exception existingProjectRegistration
+        cull: exception newProjectRegistration
+!
+
+handleEnsureProjectLoadedForDevelopment: exception
+    "if useCurrentVersion resume with true, else resume with false"
+
+    ^ exception resume: self useCurrentVersion
+!
+
+handleLookupBaselineSpecForEnsureLoad: exception
+	"if existing and new don't compare equal, then ensure the new baseline is loaded"
+
+	| existing new |
+	new := exception projectSpec.
+	existing := self lookupBaselineSpecForEnsure: exception projectSpec.
+	^ exception resume: (existing registrationsCompareEqual: new) not
+!
+
+handleLookupProjectSpec: exception
+    ^ exception
+        resume:
+            ((self lookupProjectSpecFor: exception projectSpec) ifNil: [ ^ exception resume: exception projectSpec ])
+!
+
+handleLookupProjectSpecForLoad: exception
+    "if overrideProjectSpec is nil, use currentVersion in image, ignoreImage is false"
+
+    | existing new override |
+    existing := exception projectSpec.
+    override := self useCurrentVersion
+        ifTrue: [ 
+            "don't do lookup in registry if we expect to use the #currentVersion calculation"
+            nil ]
+        ifFalse: [ 
+            new := self lookupProjectSpecFor: exception projectSpec.
+            (new compareEqual: existing)
+                ifFalse: [ 
+                    "counts as override, only if they differ in some aspect"
+                    override := new ] ].
+    ^ exception
+        resume:
+            (MetacelloProjectSpecForLoad new
+                projectSpec: existing;
+                useDetermineVersionForLoad: self useCurrentVersion;
+                overrideProjectSpec: override;
+                yourself)
+!
+
+handleNotificationsForAction: actionBlock
+	[ 
+	actionBlock
+		on:
+			MetacelloLookupProjectSpec , MetacelloLookupProjectSpecForLoad , MetacelloProjectSpecLoadedNotification
+				, MetacelloScriptEnsureProjectLoadedForDevelopment , MetacelloLookupBaselineSpecForEnsureLoad
+		do: [ :ex | 
+			"lookup and registration handlers need to be innermost set of handlers ...they may throw option notifications"
+			ex handleResolutionFor: self ] ]
+		on: MetacelloAllowProjectDowngrade , MetacelloAllowProjectUpgrade , MetacelloAllowConflictingProjectUpgrade
+		do: [ :ex | 
+			"option handlers need to be outermost set of handlers ... last line of defense before users are involved"
+			ex handleResolutionFor: self ]
+!
+
+handleProjectSpecLoaded: exception
+    MetacelloProjectRegistration
+        registrationForProjectSpec: exception projectSpec
+        ifAbsent: [ :new | 
+            new
+                loadedInImage: true;
+                registerProject ]
+        ifPresent: [ :existing :new | 
+            "unconditionally merge new with existing (updates registration)"
+            existing
+                copyOnWrite: [ :existingCopy | 
+                    existingCopy
+                        loadedInImage: true;
+                        merge: new ] ].
+    exception resume
+!
+
+handleUpgrade: exception
+    ^ (self options at: #'onUpgrade' ifAbsent: [ ^ exception pass ])
+        cull: exception
+        cull: exception existingProjectRegistration
+        cull: exception newProjectRegistration
+! !
+
+!MetacelloScriptEngine methodsFor:'options'!
+
+cacheRepository
+    ^ (MetacelloMCProject new repositorySpec description: (self options at: #'cacheRepository' ifAbsent: [ ^ nil ]))
+        createRepository
+!
+
+ignoreImage
+    ^ self options at: #'ignoreImage' ifAbsent: [ false ]
+!
+
+repositoryOverrides
+    ^ (self options at: #'repositoryOverrides' ifAbsent: [ ^ nil ])
+        collect: [ :description | (MetacelloMCProject new repositorySpec description: description) createRepository ]
+!
+
+silently
+    ^ self options at: #'silently' ifAbsent: [ false ]
+!
+
+useCurrentVersion
+    "private option used to implement the classic mode"
+
+    ^ self options at: #'useCurrentVersion' ifAbsent: [ false ]
+! !
+
+!MetacelloScriptEngine methodsFor:'project lookup'!
+
+getBaselineProjectUnconditionalLoad: unconditionalLoad
+    | project |
+    project := (self getBaselineUnconditionalLoad: unconditionalLoad) project.
+    project version spec repositories: self repositories copy.
+    ^ project
+!
+
+getBaselineUnconditionalLoad: unconditionalLoad
+    | spec |
+    spec := self projectSpec.
+    Smalltalk
+        at: spec className asSymbol
+        ifPresent: [ :cl | 
+            unconditionalLoad
+                ifFalse: [ ^ cl ] ].
+    (spec := self lookupProjectSpecFor: spec) projectPackage load.
+    ^ Smalltalk at: spec className asSymbol
+!
+
+getConfigurationProjectUnconditionalLoad: unconditionalLoad
+    ^ (self getConfigurationUnconditionalLoad: unconditionalLoad) project
+!
+
+getConfigurationUnconditionalLoad: unconditionalLoad
+    | spec |
+    spec := self projectSpec.
+    Smalltalk
+        at: spec className asSymbol
+        ifPresent: [ :cl | 
+            unconditionalLoad
+                ifFalse: [ ^ cl ] ].
+    (spec := self lookupProjectSpecFor: spec) projectPackage load.
+    ^ Smalltalk at: spec className asSymbol
+!
+
+lookupBaselineSpecForEnsure: aProjectSpec
+	| registration loadedSpec |
+	registration := MetacelloProjectRegistration
+		registrationForProjectSpec: aProjectSpec
+		ifAbsent: [ :new | new ]
+		ifPresent: [ :existing :new | existing ].
+	^ registration lookupSpec: aProjectSpec
+!
+
+lookupProjectSpecFor: aProjectSpec
+    | registration loadedSpec |
+    registration := MetacelloProjectRegistration
+        registrationForProjectSpec: aProjectSpec
+        ifAbsent: [ :new | new ]
+        ifPresent: [ :existing :new | 
+            (existing hasLoadConflicts: new)
+                ifTrue: [ 
+                    ((existing canUpgradeTo: new)
+                        ifTrue: [ MetacelloAllowProjectUpgrade new ]
+                        ifFalse: [ 
+                            (existing canDowngradeTo: new)
+                                ifTrue: [ MetacelloAllowProjectDowngrade new ]
+                                ifFalse: [ MetacelloAllowConflictingProjectUpgrade new ] ])
+                        existingProjectRegistration: existing;
+                        newProjectRegistration: new;
+                        raiseSignal ]
+                ifFalse: [ new ] ].
+    ^ registration lookupSpec: aProjectSpec
+
+    "Modified: / 02-10-2012 / 23:32:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+validateProjectSpecForScript
+    | issues |
+    issues := self projectSpec
+        validateForScriptLoad: self
+        withDefaultVersionString: self defaultVersionString
+        withDefaultRepositoryDecription: self defaultRepositoryDescription.
+    issues isEmpty
+        ifTrue: [ ^ self ].
+    (MetacelloValidationFailure issues: issues message: 'Project spec validation failure') raiseSignal
+
+    "Modified: / 02-10-2012 / 23:32:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloScriptEngine class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptEnsureProjectLoadedForDevelopment.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptNotification subclass:#MetacelloScriptEnsureProjectLoadedForDevelopment
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptEnsureProjectLoadedForDevelopment methodsFor:'exception handling'!
+
+defaultAction
+    "Go ahead and download a new copy of configuration because blessing is #development"
+
+    ^ true
+! !
+
+!MetacelloScriptEnsureProjectLoadedForDevelopment methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+    ^ aScriptEngine handleEnsureProjectLoadedForDevelopment: self
+! !
+
+!MetacelloScriptEnsureProjectLoadedForDevelopment class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptExecutor.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,233 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloScriptExecutor
+	instanceVariableNames:'options roots singleRoot projectSpecGenerator actionArg
+		configurationArg baselineArg projectArg classNameArg versionArg
+		repositoryArg'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptExecutor methodsFor:'accessing'!
+
+options
+    options ifNil: [ options := Dictionary new ].
+    ^ options
+!
+
+roots
+    roots ifNil: [ roots := OrderedCollection new ].
+    ^ roots
+!
+
+singleRoot
+    singleRoot ifNil: [ singleRoot := false ].
+    ^ singleRoot
+!
+
+singleRoot: aBool
+    singleRoot := aBool
+! !
+
+!MetacelloScriptExecutor methodsFor:'actions api'!
+
+fetch: required
+    actionArg := #'fetch:' -> {required}
+!
+
+get
+    actionArg := #'get' -> #()
+!
+
+list
+    actionArg := #'list' -> #()
+!
+
+load: required
+    actionArg := #'load:' -> {required}
+!
+
+lock
+    actionArg := #'lock' -> #()
+!
+
+record: required
+    actionArg := #'record:' -> {required}
+!
+
+unlock
+    actionArg := #'unlock' -> #()
+! !
+
+!MetacelloScriptExecutor methodsFor:'args'!
+
+baselineArg
+	^ baselineArg
+!
+
+baselineArg: anObject
+	baselineArg := anObject
+!
+
+classNameArg
+    ^ classNameArg
+!
+
+classNameArg: anObject
+    classNameArg := anObject
+!
+
+configurationArg
+    ^ configurationArg
+!
+
+configurationArg: anObject
+    configurationArg := anObject
+!
+
+projectArg
+    ^ projectArg
+!
+
+projectArg: anObject
+    projectArg := anObject
+!
+
+repositoryArg
+    ^ repositoryArg
+!
+
+repositoryArg: anObject
+    repositoryArg := anObject
+!
+
+versionArg
+    ^ versionArg
+!
+
+versionArg: anObject
+    versionArg := anObject
+! !
+
+!MetacelloScriptExecutor methodsFor:'execution'!
+
+applyArgsToProjectSpec: aProjectSpec
+    classNameArg ifNotNil: [ aProjectSpec className: classNameArg ].
+    versionArg ifNotNil: [ aProjectSpec versionString: versionArg ].
+    repositoryArg ifNotNil: [ aProjectSpec repository: repositoryArg ].
+    ^ aProjectSpec
+!
+
+execute: statements
+    statements
+        do: [ :assoc | assoc value ifNil: [ self perform: assoc key ] ifNotNil: [ self perform: assoc key withArguments: assoc value ] ].
+    projectSpecGenerator := self projectSpecGenerator.
+    projectSpecGenerator target
+        execute: [ :projectSpec | 
+            | engine root |
+
+            engine := MetacelloScriptEngine new
+                options: self options copy;
+                projectSpec: projectSpec;
+                yourself.
+            engine perform: actionArg key withArguments: actionArg value.
+            (root := engine root) ifNotNil: [ self roots add: root ] ]
+        against: self.
+    ^ (self singleRoot and: [ self roots size == 1 ])
+        ifTrue: [ self roots first ]
+        ifFalse: [ self roots ]
+!
+
+projectSpecGenerator
+    baselineArg
+        ifNotNil: [ 
+            configurationArg ifNotNil: [ self error: ' baseline: and configuration: are both be specified' ].
+            projectArg ifNotNil: [ self error: ' baseline: and project are both be specified' ].
+            ^ MetacelloBaselineSpecGenerator new
+                target: baselineArg;
+                yourself ].
+    configurationArg
+        ifNotNil: [ 
+            baselineArg ifNotNil: [ self error: ' baseline: and configuration: are both be specified' ].
+            projectArg ifNotNil: [ self error: ' configuration and project are both be specified' ].
+            ^ MetacelloConfigurationSpecGenerator new
+                target: configurationArg;
+                yourself ].
+    projectArg
+        ifNotNil: [ 
+            configurationArg ifNotNil: [ self error: ' project and configuration: are both be specified' ].
+            baselineArg ifNotNil: [ self error: ' baseline: and project are both be specified' ].
+            ^ MetacelloProjectSpecGenerator new
+                target: projectArg;
+                yourself ].
+    self error: 'project, baseline, or configuration not specified'
+! !
+
+!MetacelloScriptExecutor methodsFor:'execution callback'!
+
+executeBlock: selectBlock do: projectSpecBlock
+    ((projectSpecGenerator projectSpecListBlock value select: selectBlock) select: self projectSpecSelectBlock)
+        do: [ :projectSpec | projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ]
+!
+
+executeCollection: aCollection do: projectSpecBlock
+    aCollection
+        do: [ :projectName | 
+            ((projectSpecGenerator projectSpecLookupBlock value: projectName) select: self projectSpecSelectBlock)
+                do: [ :projectSpec | projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ] ]
+!
+
+executeString: aString do: projectSpecBlock
+    self singleRoot: true.
+    ((projectSpecGenerator projectSpecLookupBlock value: aString) select: self projectSpecSelectBlock)
+        do: [ :projectSpec | projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ]
+!
+
+projectSpecSelectBlock
+    ^ [ :projectSpec | true ]
+! !
+
+!MetacelloScriptExecutor methodsFor:'options api'!
+
+cacheRepository: aRepositoryDescription
+    self options at: #'cacheRepository' put: aRepositoryDescription
+!
+
+ignoreImage: aBool
+    self options at: #'ignoreImage' put: aBool
+!
+
+onConflict: aBlock
+    self options at: #'onConflict' put: aBlock
+!
+
+onDowngrade: aBlock
+    self options at: #'onDowngrade' put: aBlock
+!
+
+onUpgrade: aBlock
+    self options at: #'onUpgrade' put: aBlock
+!
+
+repositoryOverrides: aRepositoryDescriptionList
+    self options at: #'repositoryOverrides' put: aRepositoryDescriptionList
+!
+
+silently: aBool
+    self options at: #'silently' put: aBool
+!
+
+useCurrentVersion: aBool
+    "private option used to implement the classic mode"
+
+    self options at: #'useCurrentVersion' put: aBool
+! !
+
+!MetacelloScriptExecutor class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptGitHubDownloadNotification.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,34 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloScriptGitHubDownloadNotification
+	instanceVariableNames:'projectPath versionString'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptGitHubDownloadNotification methodsFor:'accessing'!
+
+projectPath
+	^ projectPath
+!
+
+projectPath: anObject
+	projectPath := anObject
+!
+
+versionString
+	^ versionString
+!
+
+versionString: anObject
+	versionString := anObject
+! !
+
+!MetacelloScriptGitHubDownloadNotification class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptImageExecutor.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,29 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptExecutor subclass:#MetacelloScriptImageExecutor
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptImageExecutor methodsFor:'execution callback'!
+
+projectSpecSelectBlock
+    ^ [ :projectSpec | 
+    projectSpec
+        ifNil: [ false ]
+        ifNotNil: [ 
+            MetacelloProjectRegistration
+                registrationForProjectSpec: projectSpec
+                ifAbsent: [ false ]
+                ifPresent: [ :existingRegistration :newRegistration | existingRegistration loadedInImage ] ] ]
+! !
+
+!MetacelloScriptImageExecutor class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptNotification.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,22 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloScriptNotification
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptNotification methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+    self subclassResponsibility
+! !
+
+!MetacelloScriptNotification class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptProjectSpecNotification.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,34 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptNotification subclass:#MetacelloScriptProjectSpecNotification
+	instanceVariableNames:'projectSpec'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptProjectSpecNotification methodsFor:'accessing'!
+
+projectSpec
+    ^ projectSpec
+!
+
+projectSpec: anObject
+    projectSpec := anObject
+! !
+
+!MetacelloScriptProjectSpecNotification methodsFor:'exception description'!
+
+defaultAction
+    "Result of signal should be the projectSpec to be used to perform the load"
+
+    ^ self projectSpec
+! !
+
+!MetacelloScriptProjectSpecNotification class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptRegistryExecutor.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,27 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptExecutor subclass:#MetacelloScriptRegistryExecutor
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptRegistryExecutor methodsFor:'actions api'!
+
+prime
+!
+
+remove
+!
+
+reset
+! !
+
+!MetacelloScriptRegistryExecutor class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptingError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloScriptingError
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptingError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSemanticVersionNumber.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,398 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Magnitude subclass:#MetacelloSemanticVersionNumber
+	instanceVariableNames:'normalVersion preReleaseVersion buildVersion'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Model'
+!
+
+
+!MetacelloSemanticVersionNumber class methodsFor:'instance creation'!
+
+fromString: aString
+    ^ self fromString: aString forPattern: false
+!
+
+fromString: aString forPattern: forPattern
+    | new tokens preRelease build versionString identifierCount normalEnd preReleaseEnd normalComponents preReleaseComponents buildComponents |
+    normalComponents := OrderedCollection new.
+    preReleaseComponents := OrderedCollection new.
+    buildComponents := OrderedCollection new.
+    preRelease := aString indexOf: $- startingAt: 1.
+    build := aString indexOf: $+ startingAt: 1.
+    (build > 0 and: [ preRelease > build ])
+        ifTrue: [ preRelease := 0 ].
+    normalEnd := preRelease = 0
+        ifTrue: [ 
+            build = 0
+                ifTrue: [ aString size ]
+                ifFalse: [ build - 1 ] ]
+        ifFalse: [ preRelease - 1 ].
+    versionString := aString copyFrom: 1 to: normalEnd.
+    identifierCount := 0.
+    (versionString findTokens: '.')
+        do: [ :subString | 
+            | integer |
+            forPattern
+                ifTrue: [ integer := subString ]
+                ifFalse: [ 
+                    integer := subString asInteger.
+                    integer < 0
+                        ifTrue: [ self error: 'invalid version number: normal version component must be integer ' , subString printString ] ].
+            normalComponents add: integer.
+            identifierCount := identifierCount + 1 ].
+    (forPattern not and: [ identifierCount ~= 3 ])
+        ifTrue: [ self error: 'invalid version number: normal version must have only 3 components' ].
+    preReleaseEnd := build = 0
+        ifTrue: [ aString size ]
+        ifFalse: [ build - 1 ].
+    preRelease > 0
+        ifTrue: [ 
+            versionString := aString copyFrom: preRelease + 1 to: preReleaseEnd.
+            (versionString findTokens: '.')
+                do: [ :subString | 
+                    (forPattern or: [ self isSemanticIdentifier: subString ])
+                        ifFalse: [ self error: 'invalid version number: preRelease version component must be one of [0-9A-Za-z-]' ].
+                    preReleaseComponents add: (self extractNumericComponent: subString forPattern: forPattern) ] ].
+    build > 0
+        ifTrue: [ 
+            versionString := aString copyFrom: build + 1 to: aString size.
+            (versionString findTokens: '.')
+                do: [ :subString | 
+                    (forPattern or: [ self isSemanticIdentifier: subString ])
+                        ifFalse: [ self error: 'invalid version number: build version component must be one of [0-9A-Za-z-]' ].
+                    buildComponents add: (self extractNumericComponent: subString forPattern: forPattern) ] ].
+    ^ self new
+        normalVersion: normalComponents;
+        preReleaseVersion: preReleaseComponents;
+        buildVersion: buildComponents;
+        yourself
+! !
+
+!MetacelloSemanticVersionNumber class methodsFor:'private'!
+
+extractNumericComponent: subString forPattern: forPattern
+    "$. separated components are integers"
+
+    | number |
+    forPattern
+        ifTrue: [ ^ subString ].
+    number := [ subString asNumber ]
+        on: Error
+        do: [ :ex | ex return: subString ].
+    ^ number asString = subString
+        ifTrue: [ number ]
+        ifFalse: [ subString ]
+!
+
+isSemanticIdentifier: aString
+    "whether the receiver is composed entirely of alphanumerics"
+
+    aString
+        do: [ :c | 
+            c isAlphaNumeric
+                ifFalse: [ 
+                    c = $-
+                        ifFalse: [ ^ false ] ] ].
+    ^ true
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'accessing'!
+
+approximateBase
+
+	| base |
+	base := self copyFrom: 1 to: self size - 1.
+	base at: base size put: (base at: base size) + 1.
+	^base
+!
+
+buildVersion
+    buildVersion ifNil: [ buildVersion := #() ].
+    ^ buildVersion
+!
+
+buildVersion: anObject
+	buildVersion := anObject
+!
+
+normalVersion
+    normalVersion ifNil: [ normalVersion := #() ].
+    ^ normalVersion
+!
+
+normalVersion: anObject
+	normalVersion := anObject
+!
+
+preReleaseVersion
+    preReleaseVersion ifNil: [ preReleaseVersion := #() ].
+    ^ preReleaseVersion
+!
+
+preReleaseVersion: anObject
+	preReleaseVersion := anObject
+!
+
+versionString
+
+	| strm |
+	strm := WriteStream on: String new.
+	self printOn: strm.
+	^strm contents
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'comparing'!
+
+< aMetacelloVersionNumber
+    aMetacelloVersionNumber species = self species
+        ifFalse: [ ^ false ].
+    ^ self compareLessThan: aMetacelloVersionNumber
+!
+
+= aMetacelloVersionNumber
+    aMetacelloVersionNumber species = self species
+        ifFalse: [ ^ false ].
+    ^ self compareEqualTo: aMetacelloVersionNumber
+!
+
+hash
+    ^ self versionComponents hash
+!
+
+match: aVersionPattern
+    "Answer whether the version number of the receiver matches the given pattern string.
+
+	 A Metacello version number is made up of version sequences delimited by the characters $. and $-.
+	 The $. introduces a numeric version sequence and $- introduces an alphanumeric version sequence.
+	 
+	 A version pattern is made up of version pattern match sequences. also delimited by the characters $. 
+	 and $-.. Each pattern match sequence is tested against the corresponding version sequence of the 
+	 receiver, using the 'standard' pattern matching rules. All sequences must answer true for a match.
+	
+	 The special pattern sequence '?' is a match for the corresponding version sequence and all subsequent 
+	 version sequences. '?' as the version pattern matches all versions. No more version pattern 
+	 sequences are permitted once the '?' sequence is used. If used, it is the last version pattern
+	 sequence. "
+
+    | patternVersion mySize patternSize components |
+    patternVersion := (self class fromString: aVersionPattern forPattern: true) versionComponents.
+    components := self versionComponents.
+    mySize := components size.
+    patternSize := patternVersion size.
+    mySize = patternSize
+        ifFalse: [ 
+            mySize < patternSize
+                ifTrue: [ ^ false ].
+            (patternVersion at: patternSize) ~= '?'
+                ifTrue: [ ^ false ].
+            mySize := patternSize ].
+    1 to: mySize do: [ :i | 
+        | pattern |
+        pattern := (patternVersion at: i) asString.
+        pattern = '?'
+            ifTrue: [ 
+                i = mySize
+                    ifFalse: [ ^ self error: 'Invalid version match pattern: ' , aVersionPattern printString ] ]
+            ifFalse: [ 
+                (pattern match: (components at: i) asString)
+                    ifFalse: [ ^ false ] ] ].
+    ^ true
+!
+
+~> aMetacelloVersionNumber
+
+	aMetacelloVersionNumber size == 1 ifTrue: [ ^false ].
+	^self >= aMetacelloVersionNumber and: [ self < aMetacelloVersionNumber approximateBase ]
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'converting'!
+
+asMetacelloSemanticVersionNumber
+    ^ self
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'copying'!
+
+copyFrom: start to: stop 
+	"Answer a copy of a subset of the receiver, starting from element at 
+	index start until element at index stop."
+
+	| newSize new j |
+	newSize := stop - start + 1.
+	new := self species new: newSize.
+	j := 0.
+	start to: stop do: [:i |
+		new at: j + 1 put: (self at: i).
+		j := j + 1 ].
+	^new
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'enumerating'!
+
+do: aBlock 
+	"Refer to the comment in Collection|do:."
+	1 to: self size do:
+		[:index | aBlock value: (self at: index)]
+!
+
+do: elementBlock separatedBy: separatorBlock
+	"Evaluate the elementBlock for all elements in the receiver,
+	and evaluate the separatorBlock between."
+
+	| beforeFirst | 
+	beforeFirst := true.
+	self do:
+		[:each |
+		beforeFirst
+			ifTrue: [beforeFirst := false]
+			ifFalse: [separatorBlock value].
+		elementBlock value: each]
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'operations'!
+
+decrementMinorVersionNumber
+	| int |
+	self size to: 1 by: -1 do: [ :index | 
+		(int := self at: index) isString
+			ifFalse: [ 
+				int > 0
+					ifTrue: [ self at: index put: int - 1 ].
+				^ self ] ]
+!
+
+incrementMinorVersionNumber
+
+	| int |
+	self size to: 1 by: -1 do: [:index | 
+		(int := self at: index) isString 
+			ifFalse: [ 
+				self at: index put: int + 1.
+				^self ]].
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'printing'!
+
+asString
+	"Answer a string that represents the receiver."
+
+	^ self printString
+!
+
+print: components prefix: prefixChar on: aStream
+    | beforeFirst |
+    beforeFirst := true.
+    components
+        do: [ :component | 
+            beforeFirst
+                ifTrue: [ 
+                    beforeFirst := false.
+                    prefixChar ifNotNil: [ aStream nextPut: prefixChar ] ]
+                ifFalse: [ aStream nextPut: $. ].
+            aStream nextPutAll: component asString ]
+!
+
+printOn: aStream
+    self print: self normalVersion prefix: nil on: aStream.
+    self print: self preReleaseVersion prefix: $- on: aStream.
+    self print: self buildVersion prefix: $+ on: aStream
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'private'!
+
+compareEqualTo: aMetacelloVersionNumber
+    aMetacelloVersionNumber species = self species
+        ifFalse: [ ^ false ].
+    (self compareEqualTo: self normalVersion other: aMetacelloVersionNumber normalVersion)
+        ifFalse: [ ^ false ].
+    (self compareEqualTo: self preReleaseVersion other: aMetacelloVersionNumber preReleaseVersion)
+        ifFalse: [ ^ false ].
+    ^ self compareEqualTo: self buildVersion other: aMetacelloVersionNumber buildVersion
+!
+
+compareEqualTo: myComponents other: otherComponents
+    | mySize |
+    mySize := myComponents size.
+    mySize = otherComponents size
+        ifFalse: [ ^ false ].
+    1 to: mySize do: [ :i | 
+        (myComponents at: i) = (otherComponents at: i)
+            ifFalse: [ ^ false ] ].
+    ^ true
+!
+
+compareLessThan: aMetacelloVersionNumber
+    | myComponents otherComponents defaultResult |
+    aMetacelloVersionNumber species = self species
+        ifFalse: [ ^ false ].
+    myComponents := self normalVersion.
+    otherComponents := aMetacelloVersionNumber normalVersion.
+    defaultResult := true.
+    (self compareEqualTo: myComponents other: otherComponents)
+        ifTrue: [ defaultResult := false ]
+        ifFalse: [ 
+            (self compareLessThan: myComponents other: otherComponents version: #'normal')
+                ifFalse: [ ^ false ] ].
+    myComponents := self preReleaseVersion.
+    otherComponents := aMetacelloVersionNumber preReleaseVersion.
+    (self compareEqualTo: myComponents other: otherComponents)
+        ifTrue: [ 
+            myComponents size > 0
+                ifTrue: [ defaultResult := false ] ]
+        ifFalse: [ ^ self compareLessThan: myComponents other: otherComponents version: #'preRelease' ].
+    myComponents := self buildVersion.
+    otherComponents := aMetacelloVersionNumber buildVersion.
+    ^ (self compareEqualTo: myComponents other: otherComponents)
+        ifTrue: [ defaultResult ]
+        ifFalse: [ self compareLessThan: myComponents other: otherComponents version: #'build' ]
+!
+
+compareLessThan: myComponents other: otherComponents version: version
+    | mySize aSize commonSize count more |
+    mySize := myComponents size.
+    aSize := otherComponents size.
+    commonSize := mySize min: aSize.
+    count := 0.
+    more := true.
+    [ more and: [ count < commonSize ] ]
+        whileTrue: [ 
+            (myComponents at: count + 1) = (otherComponents at: count + 1)
+                ifTrue: [ count := count + 1 ]
+                ifFalse: [ more := false ] ].
+    count < commonSize
+        ifTrue: [ ^ (myComponents at: count + 1) metacelloSemanticVersionComponentLessThan: (otherComponents at: count + 1) ].
+    mySize < aSize
+        ifTrue: [ 
+            mySize = 0
+                ifTrue: [ 
+                    #'preRelease' == version
+                        ifTrue: [ ^ false ].
+                    ^ true ].
+            (myComponents at: commonSize) = (otherComponents at: commonSize)
+                ifFalse: [ ^ true ].
+            ^ true ]
+        ifFalse: [ 
+            mySize = aSize
+                ifTrue: [ ^ false ].
+            aSize = 0
+                ifTrue: [ 
+                    #'build' == version
+                        ifTrue: [ ^ false ].
+                    ^ true ].
+            (myComponents at: commonSize) = (otherComponents at: commonSize)
+                ifFalse: [ ^ false ].
+            ^ true ]
+!
+
+versionComponents
+    ^ self normalVersion , self preReleaseVersion , self buildVersion
+! !
+
+!MetacelloSemanticVersionNumber class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSkipDirtyPackageLoad.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,43 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloSkipDirtyPackageLoad
+	instanceVariableNames:'packageSpec'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloSkipDirtyPackageLoad class methodsFor:'signalling'!
+
+signal: aMetacelloPackageSpec
+
+        ^(self new packageSpec: aMetacelloPackageSpec) raiseSignal
+
+    "Modified: / 02-10-2012 / 23:32:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloSkipDirtyPackageLoad methodsFor:'accessing'!
+
+defaultAction
+	"Default action is to skip the load of a dirty package"
+
+	^true
+!
+
+packageSpec
+
+	^packageSpec
+!
+
+packageSpec: aMetacelloPackageSpec
+
+	packageSpec := aMetacelloPackageSpec
+! !
+
+!MetacelloSkipDirtyPackageLoad class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,237 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloSpec
+	instanceVariableNames:'project loader mutable'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloSpec class methodsFor:'instance creation'!
+
+for: aVersionMap
+
+	^(self platformClass new)
+		for: aVersionMap;
+		yourself
+! !
+
+!MetacelloSpec class methodsFor:'accessing'!
+
+platformClass
+
+	^self
+! !
+
+!MetacelloSpec methodsFor:'accessing'!
+
+loader
+
+	loader == nil 
+		ifTrue: [ | prjctLoader |
+			(prjctLoader := self project loader) == nil
+				ifTrue: [ self loader: (self project loaderClass on: self) ]
+				ifFalse: [ self loader: prjctLoader ]].
+	^loader
+!
+
+loader: aLoader
+    "We're interested in propogating the loader state, _except_ for the spec"
+
+    self shouldBeMutable.
+    loader := aLoader copy.
+    loader spec: self
+! !
+
+!MetacelloSpec methodsFor:'copying'!
+
+postCopy
+    super postCopy.
+    mutable := nil.
+    loader ~~ nil
+        ifTrue: [ self loader: loader ].
+! !
+
+!MetacelloSpec methodsFor:'doits'!
+
+doItBlock: selector
+
+	selector == nil ifTrue: [ ^nil ].
+	selector numArgs = 0
+		ifTrue: [ ^[ self project configuration perform: selector ] ].
+	selector numArgs = 1
+		ifTrue: [ ^[:aLoader | self project configuration perform: selector with: aLoader ] ].
+	selector numArgs = 2
+		ifTrue: [ ^[:aLoader :pkgSpec | self project configuration perform: selector with: aLoader with: pkgSpec ] ].
+	^nil
+!
+
+postLoadDoIt
+	"noop unless non-nil value returned"
+
+	^nil
+!
+
+postLoadDoItBlock
+
+	^self doItBlock: self postLoadDoIt value
+!
+
+preLoadDoIt
+	"noop unless non-nil value returned"
+	
+	^nil
+!
+
+preLoadDoItBlock
+
+	^self doItBlock: self preLoadDoIt value
+! !
+
+!MetacelloSpec methodsFor:'importing'!
+
+mergeImportLoads: aLoadList
+    self error: 'import: can only be used with baseline project specs'
+! !
+
+!MetacelloSpec methodsFor:'initialization'!
+
+for: aProject
+    self shouldBeMutable.
+    project := aProject
+! !
+
+!MetacelloSpec methodsFor:'merging'!
+
+aboutToCopy
+!
+
+mergeMap
+
+	^Dictionary new.
+!
+
+mergeSpec: aSpec
+    | newSpec nonOverridable |
+    self validateMergeForSpec: aSpec.
+    newSpec := self copy.
+    nonOverridable := self nonOverridable.
+    aSpec mergeMap
+        keysAndValuesDo: [ :key :value | 
+            (nonOverridable includes: key)
+                ifFalse: [ 
+                    value ~~ nil
+                        ifTrue: [ newSpec instVarNamed: key asString put: value ] ] ].
+    ^ newSpec
+!
+
+nonOverridable
+
+	^#()
+!
+
+validateMergeForSpec: aSpec
+    aSpec class = self class
+        ifFalse: [ 
+            self
+                error:
+                    'The project spec ' , self name printString , ' in project ' , self project label , ' has incompatible specs. '
+                        , aSpec class name asString , ' and ' , self class name asString , ' are not compatible.' ]
+! !
+
+!MetacelloSpec methodsFor:'mutability'!
+
+copyOnWrite: aBlock
+    "assume that only registered projects are immutable ... otherwise you'll get an error"
+
+    | copy |
+    copy := self copy.
+    aBlock value: copy.
+    ^ copy
+!
+
+immutable
+    mutable := false
+!
+
+isMutable
+    mutable ifNil: [ ^ true ].
+    ^ mutable
+!
+
+mutable
+    mutable := true
+!
+
+shouldBeMutable
+    self isMutable
+        ifTrue: [ ^ self ].
+    self error: 'Not allowed to modify an immutable object'
+! !
+
+!MetacelloSpec methodsFor:'printing'!
+
+configMethodOn: aStream
+
+	self configMethodOn: aStream indent: 0
+
+!
+
+configMethodOn: aStream indent: indent
+
+	self subclassResponsibility
+
+!
+
+label
+
+	^self printString
+!
+
+printOn: aStream
+
+	self configMethodOn: aStream indent: 0
+
+! !
+
+!MetacelloSpec methodsFor:'querying'!
+
+answers
+
+	^#()
+!
+
+project
+
+	^project
+! !
+
+!MetacelloSpec methodsFor:'spec creation'!
+
+addMember
+
+	^MetacelloAddMemberSpec for: self project
+!
+
+copyMember
+
+	^MetacelloCopyMemberSpec for: self project
+!
+
+mergeMember
+
+	^MetacelloMergeMemberSpec for: self project
+!
+
+removeMember
+
+	^MetacelloRemoveMemberSpec for: self project
+! !
+
+!MetacelloSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSpecLoader.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,65 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloSpecLoader
+	instanceVariableNames:'spec'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Loaders'
+!
+
+
+!MetacelloSpecLoader class methodsFor:'instance creation'!
+
+on: aMetacelloPackagesSpec
+
+	^(self new) 
+		spec: aMetacelloPackagesSpec;
+		yourself
+! !
+
+!MetacelloSpecLoader methodsFor:'accessing'!
+
+loadType
+	"#atomic or #linear"
+	
+	^self project loadType
+!
+
+project
+
+	^self spec project
+!
+
+spec
+
+	^spec
+!
+
+spec: aMetacelloPackagesSpec
+
+	spec := aMetacelloPackagesSpec
+! !
+
+!MetacelloSpecLoader methodsFor:'actions'!
+
+load
+
+	self subclassResponsibility
+!
+
+unload
+
+	self subclassResponsibility
+! !
+
+!MetacelloSpecLoader class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloStackCacheNotification.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloStackCacheNotification
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloStackCacheNotification class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSymbolicVersionDoesNotExistError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,31 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloVersionDoesNotExistError subclass:#MetacelloSymbolicVersionDoesNotExistError
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloSymbolicVersionDoesNotExistError methodsFor:'accessing'!
+
+possibleVersions
+    ^ self project symbolicVersionSymbols
+! !
+
+!MetacelloSymbolicVersionDoesNotExistError methodsFor:'printing'!
+
+description
+    "Return a textual description of the exception."
+
+    ^ 'The symbolic version ' , self versionString printString , ' is not defined in ' , self project label
+        , ' for the current platform. Possible symbolic version values include: ' , self possibleVersions printString
+! !
+
+!MetacelloSymbolicVersionDoesNotExistError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSymbolicVersionMethodSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,67 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMethodSpec subclass:#MetacelloSymbolicVersionMethodSpec
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloSymbolicVersionMethodSpec methodsFor:'accessing'!
+
+versionString: aStringOrSymbol
+
+	aStringOrSymbol isSymbol ifFalse: [ self error: 'Version symbol ', aStringOrSymbol printString, ' for symbolic version method must be a Symbol' ].
+	super versionString: aStringOrSymbol
+! !
+
+!MetacelloSymbolicVersionMethodSpec methodsFor:'adding'!
+
+addMethodSection: attribute versionString: aString
+	self methodSections
+		add:
+			((MetacelloSymbolicVersionSpec new)
+				attribute: attribute;
+				versionString: aString;
+				yourself)
+! !
+
+!MetacelloSymbolicVersionMethodSpec methodsFor:'method generation'!
+
+methodSource
+	| strm |
+	strm := WriteStream on: String new.
+	self symbolicMethodSelectorAndPragma: self selector symbolicVersionSymbol: self versionString on: strm.
+	(self methodSections asArray sort: [ :a :b | a attribute <= b attribute ])
+		do: [ :methodSection | 
+			| vs |
+			strm
+				cr;
+				tab;
+				nextPutAll: 'spec for: #' , methodSection attribute asString printString , ' version: '.
+			vs := methodSection versionString.
+			vs isSymbol
+				ifTrue: [ strm nextPut: $# ].
+			strm
+				nextPutAll: vs asString printString , '.';
+				cr ].
+	^ strm contents
+!
+
+symbolicMethodSelectorAndPragma: aSelector symbolicVersionSymbol: symbolicVersionSymbol on: strm
+	strm
+		nextPutAll: aSelector asString , ' spec';
+		cr;
+		tab;
+		nextPutAll: '<symbolicVersion: #' , symbolicVersionSymbol asString printString;
+		nextPutAll: '>';
+		cr
+! !
+
+!MetacelloSymbolicVersionMethodSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSymbolicVersionNotDefinedError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,25 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSymbolicVersionDoesNotExistError subclass:#MetacelloSymbolicVersionNotDefinedError
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloSymbolicVersionNotDefinedError methodsFor:'printing'!
+
+description
+    "Return a textual description of the exception."
+
+    ^ 'The symbolic version ' , self versionString printString , ' is EXPLICITLY not defined in ' , self project label
+        , ' for the current platform (i.e., symbolic version defined as #notDefined).'
+! !
+
+!MetacelloSymbolicVersionNotDefinedError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSymbolicVersionSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,26 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMethodSection subclass:#MetacelloSymbolicVersionSpec
+	instanceVariableNames:'versionString'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloSymbolicVersionSpec methodsFor:'accessing'!
+
+versionString
+	^ versionString
+!
+
+versionString: anObject
+	versionString := anObject
+! !
+
+!MetacelloSymbolicVersionSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloToolBoxConstructor.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,130 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractVersionConstructor subclass:#MetacelloToolBoxConstructor
+	instanceVariableNames:'currentSection methodSections'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloToolBoxConstructor methodsFor:'api'!
+
+for: attribute do: aBlock
+	"conditional version support"
+
+	| methodSection |
+	methodSection := (MetacelloVersionMethodSection new)
+				attribute: attribute;
+				block: aBlock;
+				yourself.
+	currentSection ~~ nil
+		ifTrue: [ currentSection addMethodSection: methodSection ]
+		ifFalse: [ self methodSections add: methodSection]
+!
+
+for: attribute version: aString
+	"conditional symbolicVersion support"
+
+	self methodSections
+		add:
+			((MetacelloSymbolicVersionSpec new)
+				attribute: attribute;
+				versionString: aString;
+				yourself)
+! !
+
+!MetacelloToolBoxConstructor methodsFor:'enumeration'!
+
+methodSectionsDo: aBlock
+
+	self methodSection: self do: aBlock
+!
+
+methodSectionsInEvaluationOrder: attributes do: aBlock
+	"breadth first traversal ... to collect selected sections, then evaluate individual sections in attribute order"
+
+	| selected |
+	selected := OrderedCollection new.
+	self methodSection: self inEvaluationOrder: attributes do: [:methodSection | selected add: methodSection ]. 
+	attributes
+		do: [ :attribute | (selected select: [ :methodSection | methodSection attribute == attribute ]) do: aBlock ].
+! !
+
+!MetacelloToolBoxConstructor methodsFor:'extraction'!
+
+extractMethodSectionsFor: sourceVersionString
+	| coll pragma |
+	coll := self extractAllVersionPragmas at: sourceVersionString ifAbsent: [ ^ #() ].
+	coll size > 1
+		ifTrue: [ self error: 'More than one pragma defining ' , sourceVersionString printString ].
+	pragma := coll at: 1.
+	self evaluatePragma: pragma.
+	self methodSections do: [ :methodSection | self evaluateMethodSection: methodSection version: sourceVersionString ].
+!
+
+extractSymbolicVersionSpecsFor: sourceVersionSymbol
+	| coll versionSpec pragma |
+	coll := self extractSymbolicVersionPragmas at: sourceVersionSymbol ifAbsent: [ ^ #() ].
+	coll size > 1
+		ifTrue: [ self error: 'More than one pragma defining ' , sourceVersionSymbol printString ].
+	pragma := coll at: 1.
+	self evaluatePragma: pragma.
+	^ self methodSections
+
+! !
+
+!MetacelloToolBoxConstructor methodsFor:'initialization'!
+
+reset
+	super reset.	"not needed, but included for completeness"
+	methodSections := nil
+! !
+
+!MetacelloToolBoxConstructor methodsFor:'private'!
+
+evaluateMethodSection: methodSection version: sourceVersionString
+	| versionSpec |
+	versionSpec := self project versionSpec.
+	versionSpec versionString: sourceVersionString.
+	methodSection versionSpec: versionSpec.
+	currentSection := methodSection.
+	self with: versionSpec during: methodSection block.
+	methodSection methodSections do: [ :ms | self evaluateMethodSection: ms version: sourceVersionString ]
+!
+
+methodSection: methodSection do: aBlock
+
+	methodSection methodSections do: aBlock.
+	methodSection methodSections do: [ :ms | self methodSection: ms do: aBlock ]
+!
+
+methodSection: methodSection inEvaluationOrder: attributes do: aBlock
+
+	| selected |
+	selected := OrderedCollection new.
+	attributes
+		do: [ :attribute | 
+			methodSection methodSections
+				do: [ :ms | 
+					attribute == ms attribute
+						ifTrue: [ selected add: ms ] ] ].
+	selected do: aBlock.
+	attributes size == 1
+		ifTrue: [ ^ self ].
+	selected
+		do: [ :ms | self methodSection: ms inEvaluationOrder: (attributes copyFrom: 2 to: attributes size) do: aBlock ]
+!
+
+methodSections
+
+	methodSections == nil ifTrue: [ methodSections := OrderedCollection new ].
+	^methodSections
+! !
+
+!MetacelloToolBoxConstructor class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloUseUpgradeError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptingError subclass:#MetacelloUseUpgradeError
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloUseUpgradeError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationCriticalWarning.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloValidationIssue subclass:#MetacelloValidationCriticalWarning
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Validation'
+!
+
+
+!MetacelloValidationCriticalWarning methodsFor:'accessing'!
+
+label
+
+	^'Critical Warning'
+! !
+
+!MetacelloValidationCriticalWarning methodsFor:'testing'!
+
+isCriticalWarning
+
+	^true
+! !
+
+!MetacelloValidationCriticalWarning class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloValidationIssue subclass:#MetacelloValidationError
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Validation'
+!
+
+
+!MetacelloValidationError methodsFor:'accessing'!
+
+label
+
+	^'Error'
+! !
+
+!MetacelloValidationError methodsFor:'testing'!
+
+isError
+
+	^true
+! !
+
+!MetacelloValidationError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationFailure.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,34 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloValidationFailure
+	instanceVariableNames:'issues'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloValidationFailure class methodsFor:'instance creation'!
+
+issues: anObject message: aString
+    ^ self new
+        issues: anObject;
+        signal: aString
+! !
+
+!MetacelloValidationFailure methodsFor:'accessing'!
+
+issues
+	^ issues
+!
+
+issues: anObject
+	issues := anObject
+! !
+
+!MetacelloValidationFailure class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationIssue.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,127 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloValidationIssue
+	instanceVariableNames:'configurationClass explanation reasonCode callSite'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Validation'
+!
+
+
+!MetacelloValidationIssue class methodsFor:'instance creation'!
+
+configurationClass: aClass reasonCode: aSymbol callSite: aCallSite explanation: aString
+
+	^(self new)
+		configurationClass: aClass;
+		reasonCode: aSymbol;
+		callSite: aCallSite;
+		explanation: aString;
+		yourself
+! !
+
+!MetacelloValidationIssue methodsFor:'accessing'!
+
+callSite
+	^ callSite
+!
+
+callSite: anObject
+	callSite := anObject
+!
+
+configurationClass
+	^ configurationClass
+!
+
+configurationClass: aClass
+	configurationClass := aClass
+!
+
+explanation
+	^ explanation
+!
+
+explanation: aString
+	explanation := aString
+!
+
+label
+
+	^''
+!
+
+reasonCode
+
+	reasonCode == nil ifTrue: [ reasonCode := #none ].
+	^ reasonCode
+!
+
+reasonCode: anObject
+	reasonCode := anObject
+! !
+
+!MetacelloValidationIssue methodsFor:'printing'!
+
+printOn: aStream
+	aStream
+		nextPutAll: self label;
+		nextPut: $:;
+		space;
+		nextPutAll: self explanation.
+	self reasonCode ~~ #none
+		ifTrue: [ 
+			aStream
+				space;
+				nextPut: ${;
+				space;
+				nextPutAll: self reasonCode asString;
+				space;
+				nextPut: $} ].
+	(self configurationClass ~~ nil or: [ self callSite ~~ nil ])
+		ifTrue: [ 
+			aStream
+				space;
+				nextPut: $[;
+				space.
+			self configurationClass ~~ nil
+				ifTrue: [ 
+					aStream
+						nextPutAll: self configurationClass name asString;
+						space ].
+			self callSite ~~ nil
+				ifTrue: [ 
+					aStream
+						nextPutAll: self callSite name asString;
+						space ].
+			aStream nextPut: $] ]
+! !
+
+!MetacelloValidationIssue methodsFor:'testing'!
+
+isCritical
+
+	^self isError or: [ self isCriticalWarning ]
+!
+
+isCriticalWarning
+
+	^false
+!
+
+isError
+
+	^false
+!
+
+isWarning
+
+	^false
+! !
+
+!MetacelloValidationIssue class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationNotification.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,43 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloValidationNotification
+	instanceVariableNames:'issue'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloValidationNotification class methodsFor:'exceptioninstantiator'!
+
+signal: aMetacelloValidationIssue
+
+	^ self new signal: aMetacelloValidationIssue
+! !
+
+!MetacelloValidationNotification methodsFor:'accessing'!
+
+issue
+	^ issue
+!
+
+issue: anObject
+	issue := anObject
+! !
+
+!MetacelloValidationNotification methodsFor:'signaling'!
+
+signal: aMetacelloValidationIssue
+
+        self issue: aMetacelloValidationIssue.
+        ^ self raiseSignal
+
+    "Modified: / 02-10-2012 / 23:32:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloValidationNotification class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationWarning.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloValidationIssue subclass:#MetacelloValidationWarning
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Validation'
+!
+
+
+!MetacelloValidationWarning methodsFor:'accessing'!
+
+label
+
+	^'Warning'
+! !
+
+!MetacelloValidationWarning methodsFor:'testing'!
+
+isWarning
+
+	^true
+! !
+
+!MetacelloValidationWarning class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValueHolderSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,83 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloValueHolderSpec
+	instanceVariableNames:'value'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloValueHolderSpec methodsFor:'accessing'!
+
+value: anObject
+	value := anObject
+! !
+
+!MetacelloValueHolderSpec methodsFor:'construction'!
+
+value: anObject constructor: aVersionConstructor
+    aVersionConstructor valueForValueHolder: anObject
+! !
+
+!MetacelloValueHolderSpec methodsFor:'merging'!
+
+mergeMap
+
+	| map |
+	map := super mergeMap.
+	map at: #value put: value.
+	^map
+! !
+
+!MetacelloValueHolderSpec methodsFor:'printing'!
+
+configMethodOn: aStream indent: indent
+
+	aStream tab: indent; nextPutAll: 'spec value: ', self value printString
+! !
+
+!MetacelloValueHolderSpec methodsFor:'private'!
+
+setAuthorInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setAuthor: self
+!
+
+setBlessingInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setBlessing: self
+!
+
+setDescriptionInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setDescription: self
+!
+
+setPostLoadDoItInMetacelloSpec: aMetacelloSpec
+
+	aMetacelloSpec setPostLoadDoIt: self
+!
+
+setPreLoadDoItInMetacelloSpec: aMetacelloSpec
+
+	aMetacelloSpec setPreLoadDoIt: self
+!
+
+setTimestampInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setTimestamp: self
+! !
+
+!MetacelloValueHolderSpec methodsFor:'querying'!
+
+value
+	^ value
+! !
+
+!MetacelloValueHolderSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersion.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,248 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Magnitude subclass:#MetacelloVersion
+	instanceVariableNames:'spec versionNumber importedVersions versionStatus'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Model'
+!
+
+
+!MetacelloVersion class methodsFor:'instance creation'!
+
+fromSpec: aMetacelloVersionSpec
+    ^ (self new versionNumber: aMetacelloVersionSpec versionNumber)
+        spec: aMetacelloVersionSpec;
+        yourself
+!
+
+fromString: aString
+
+	^self new versionNumber: aString asMetacelloVersionNumber
+! !
+
+!MetacelloVersion methodsFor:'accessing'!
+
+basicSpec
+    ^ self spec
+!
+
+importedVersions
+
+	importedVersions == nil ifTrue: [ importedVersions := #() ].
+	^importedVersions
+!
+
+importedVersions: aCollection
+
+	importedVersions := aCollection
+!
+
+projectLabel
+    ^ self basicSpec projectLabel
+!
+
+spec
+
+	^spec
+!
+
+spec: aMetacellVersionSpec
+
+	spec := aMetacellVersionSpec
+!
+
+versionNumber: aVersionNumber
+
+	versionNumber := aVersionNumber
+!
+
+versionSpec
+
+	^self spec
+!
+
+versionStatus
+
+	versionStatus == nil ifTrue: [ versionStatus := self computeVersionStatus].
+	^versionStatus
+!
+
+versionStatus: aSymbol
+
+	versionStatus := aSymbol
+! !
+
+!MetacelloVersion methodsFor:'actions'!
+
+load
+
+	^self subclassResponsibility
+!
+
+load: required
+
+	^self subclassResponsibility
+!
+
+unload
+
+	^self spec unload
+! !
+
+!MetacelloVersion methodsFor:'comparing'!
+
+< aMetacelloVersion
+
+	aMetacelloVersion species = self species ifFalse: [ ^false ].
+	^self versionNumber < aMetacelloVersion versionNumber
+!
+
+= aMetacelloVersion
+
+	aMetacelloVersion species = self species ifFalse: [ ^false ].
+	^self versionNumber = aMetacelloVersion versionNumber
+!
+
+hash
+
+	^self versionNumber hash
+!
+
+~> aMetacelloVersion
+
+	aMetacelloVersion species = self species ifFalse: [ ^false ].
+	^self versionNumber ~> aMetacelloVersion versionNumber
+! !
+
+!MetacelloVersion methodsFor:'printing'!
+
+printOn: aStream
+    | label vs |
+    self blessing ~~ #'broken'
+        ifTrue: [ 
+            (vs := self versionStatus) == #'somethingLoaded'
+                ifTrue: [ aStream nextPutAll: '<>' ].
+            vs == #'loadedMatchConstraints'
+                ifTrue: [ aStream nextPutAll: '>=' ].
+            vs == #'loadedToSpec'
+                ifTrue: [ aStream nextPut: $~ ] ].
+    self versionNumber printOn: aStream.
+    self basicSpec ~~ nil
+        ifTrue: [ 
+            (label := self projectLabel) isEmpty
+                ifFalse: [ aStream nextPutAll: ' [' , label , ']' ] ]
+! !
+
+!MetacelloVersion methodsFor:'private'!
+
+computeVersionStatus
+	"
+		#allLoadedToSpec - all projects and packages are loaded and match specification
+		#loadedToSpec - all loaded projects and packages match specifications (at least one package loaded)
+		#loadedMatchConstraints - all loaded projects and packages match constraints (at least one package loaded)
+		#somethingLoaded - at least one package loaded
+	"
+
+	self spec computeVersionStatus: [ :status | ^ status ].
+	^ #noStatus
+! !
+
+!MetacelloVersion methodsFor:'querying'!
+
+author
+
+	^self spec author value
+!
+
+blessing
+    ^ self basicSpec blessing value
+!
+
+description
+    ^ self basicSpec description value
+!
+
+loader
+
+	^self spec loader
+!
+
+project
+    ^ self basicSpec project
+!
+
+timestamp
+    ^ self basicSpec timestamp value
+!
+
+versionKey
+    "version printString, without the versionStatus decorations, suitable for using as a unique key for the 
+	 receiver in a dictionary"
+
+    ^ String
+        streamContents: [ :aStream | 
+            | label |
+            self versionNumber printOn: aStream.
+            self basicSpec ~~ nil
+                ifTrue: [ 
+                    (label := self projectLabel) isEmpty
+                        ifFalse: [ aStream nextPutAll: ' [' , label , ']' ] ] ]
+!
+
+versionNumber
+
+	^versionNumber
+!
+
+versionNumberFrom: aString
+    ^ self versionNumber class fromString: aString
+!
+
+versionString
+
+	^self versionNumber versionString
+! !
+
+!MetacelloVersion methodsFor:'testing'!
+
+isAllLoadedToSpec
+	"all projects and packages are loaded and match specification"
+	
+	^self spec isAllLoadedToSpec
+!
+
+isLoadedMatchConstraints
+	"all loaded projects and packages match constraints"
+	
+	^self spec isLoadedMatchConstraints
+!
+
+isLoadedToSpec
+	"all loaded projects and packages match specifications"
+	
+	^self spec isLoadedToSpec
+!
+
+isPossibleBaseline
+
+	^self spec isPossibleBaseline
+!
+
+isSomethingLoaded
+	"at least one project or package has been loaded"
+	
+	^self spec isSomethingLoaded
+!
+
+name
+
+	^self versionString
+! !
+
+!MetacelloVersion class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionConstructor.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,556 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractVersionConstructor subclass:#MetacelloVersionConstructor
+	instanceVariableNames:'errorMap'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloVersionConstructor class methodsFor:'instance creation'!
+
+on: aConfig
+
+	^(self new)
+		on: aConfig;
+		yourself
+!
+
+on: aConfig project: aProject
+
+	^(self new)
+		on: aConfig project: aProject;
+		yourself
+! !
+
+!MetacelloVersionConstructor class methodsFor:'deprecated'!
+
+spawnPackageMethodIn: aConfig category: methodCategory named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString blessing: blessing
+
+	self deprecated: 'see MetacelloToolBox class>>createDevelopment:for:importFromBaseline:description: for a similar example'.
+	^self new
+		spawnPackageMethodIn: aConfig 
+		category: methodCategory 
+		named: newSelector
+		sourceVersion: sourceVersionString 
+		targetVersion: targetVersionString
+		blessing: blessing
+!
+
+spawnPackageMethodIn: aConfig named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString
+
+	self deprecated: 'see MetacelloToolBox class>>createDevelopment:for:importFromBaseline:description: for a similar example'.
+	^self 
+		spawnPackageMethodIn: aConfig 
+		category: 'versions'
+		named: newSelector 
+		sourceVersion: sourceVersionString 
+		targetVersion: targetVersionString 
+		blessing: #development
+!
+
+spawnPackageMethodIn: aConfig named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString blessing: blessing
+
+	self deprecated: 'see MetacelloToolBox class>>createDevelopment:for:importFromBaseline:description: for a similar example'.
+	^self new
+		spawnPackageMethodIn: aConfig 
+		category: 'versions'
+		named: newSelector 
+		sourceVersion: sourceVersionString 
+		targetVersion: targetVersionString
+		blessing: blessing
+!
+
+updatePackageMethodIn: aConfig sourceVersion: sourceVersionString
+
+	self deprecated: 'see MetacelloToolBox class>>updateDevelopment:for:updateProjects:description: for a similar example'.
+	^self new
+		updatePackageMethodIn: aConfig 
+		sourceVersion: sourceVersionString
+! !
+
+!MetacelloVersionConstructor methodsFor:'accessing'!
+
+errorMap
+    errorMap ifNil: [ errorMap := Dictionary new ].
+    ^ errorMap
+! !
+
+!MetacelloVersionConstructor methodsFor:'deprecated'!
+
+prepareForMethodUpdate: aConfig sourceVersion: sourceVersionString forceUpdate: forceUpdate generating: generateBlock
+	| pragmaDict versionSpecs pragmaMap updatedPackageSpecs updatedPackageSpecsMap reversed pragmaColl seenUpdatedPackageSpecs |
+	self deprecated: 'see MetacelloToolBox for replacement methods'.
+	self configuration: aConfig.
+	versionSpecs := Dictionary new.
+	pragmaMap := Dictionary new.
+	pragmaDict := self extractAllVersionPragmas.
+	pragmaColl := pragmaDict at: sourceVersionString ifAbsent: [ ^ self ].
+	pragmaColl
+		do: [ :pragma | 
+			| specs versionSpec |
+			specs := Dictionary new.
+			self evaluatePragma: pragma.
+			self attributeMap
+				keysAndValuesDo: [ :attribute :blockList | 
+					versionSpec := self project versionSpec.
+					versionSpec versionString: sourceVersionString.
+					specs at: attribute put: versionSpec.
+					blockList do: [ :block | self with: versionSpec during: block ] ].
+			versionSpecs
+				at: pragma selector
+				put:
+					{specs.
+					(self attributeOrder).
+					nil}.
+			pragmaMap at: pragma selector put: pragma.
+			self reset ].
+	versionSpecs
+		keysAndValuesDo: [ :selector :ar | 
+			updatedPackageSpecsMap := Dictionary new.
+			seenUpdatedPackageSpecs := Dictionary new.
+			ar at: 3 put: updatedPackageSpecsMap.
+			reversed := aConfig project attributes reverse.
+			reversed
+				do: [ :attribute | 
+					| vs |
+					(vs := (ar at: 1) at: attribute ifAbsent: [  ]) ~~ nil
+						ifTrue: [ 
+							updatedPackageSpecs := forceUpdate
+								ifTrue: [ vs forceUpdatedPackageSpecs ]
+								ifFalse: [ vs updatedPackageSpecs ].
+							updatedPackageSpecs associations
+								do: [ :assoc | 
+									| filename |
+									(filename := seenUpdatedPackageSpecs at: assoc key ifAbsent: [  ]) == nil
+										ifTrue: [ 
+											assoc value == #uptodate
+												ifTrue: [ 
+													"#uptodate means that the spec is up-to-date and we mark it as
+										 seen so that the spec is not update for a 'later' spec"
+													seenUpdatedPackageSpecs at: assoc key put: #uptodate ]
+												ifFalse: [ seenUpdatedPackageSpecs at: assoc key put: assoc value file ] ]
+										ifFalse: [ 
+											"if the spec was already seen as up-to-date or the file is the same as 
+								 the one already seen don't propogate the file"
+											(filename == #uptodate or: [ assoc value == #uptodate or: [ filename = assoc value file ] ])
+												ifTrue: [ updatedPackageSpecs removeKey: assoc key ] ] ].
+							updatedPackageSpecsMap at: attribute put: updatedPackageSpecs ] ].	"clear out #uptodate markers"
+			updatedPackageSpecsMap
+				valuesDo: [ :d | 
+					d associations
+						do: [ :assoc | 
+							assoc value == #uptodate
+								ifTrue: [ d removeKey: assoc key ] ] ].	"remove shadowed packages"
+			1 to: reversed size do: [ :index | 
+				| attribute d |
+				attribute := reversed at: index.
+				((d := updatedPackageSpecsMap at: attribute ifAbsent: [  ]) ~~ nil and: [ d keys size > 0 ])
+					ifTrue: [ 
+						index + 1 to: reversed size do: [ :shadowIndex | 
+							d
+								keysDo: [ :key | 
+									| dict |
+									(dict := updatedPackageSpecsMap at: (reversed at: shadowIndex) ifAbsent: [  ]) ~~ nil
+										ifTrue: [ dict removeKey: key ifAbsent: [  ] ] ] ] ] ].
+			updatedPackageSpecsMap keys
+				do: [ :key | 
+					| d |
+					d := updatedPackageSpecsMap at: key.
+					d isEmpty
+						ifTrue: [ updatedPackageSpecsMap removeKey: key ] ].	"ready to generate source for method"
+			generateBlock
+				value: selector
+				value: pragmaMap
+				value: ar
+				value: updatedPackageSpecsMap ]
+!
+
+spawnPackageMethodIn: aConfig category: methodCategory named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString blessing: blessing
+
+	self deprecated: 'see MetacelloToolBox class>>createBaseline:for:from:description: for replacement method'.
+	self 
+		prepareForMethodUpdate: aConfig 
+		sourceVersion: sourceVersionString 
+		forceUpdate: blessing ~~ #baseline
+		generating: [:selector :pragmaMap :ar :updatedPackageSpecsMap | | strm |
+			strm := WriteStream on: String new.
+			strm 
+				nextPutAll: newSelector asString, ' spec'; cr;
+				tab; nextPutAll: 
+						'<version: ', 
+						targetVersionString printString, 
+						' imports: #(', sourceVersionString printString, 
+						')>';cr.
+			(ar at: 2) do: [:attribute | | vs d |
+				vs := (ar at: 1) at: attribute.
+				(d := updatedPackageSpecsMap at: attribute ifAbsent: []) ~~ nil
+					ifTrue: [ 
+						vs packagesSpec list do: [:member | | x |
+							x := d at: member spec name ifAbsent: [].
+						 	member spec updateForSpawnMethod: x ]]
+					ifFalse: [
+						vs packagesSpec list do: [:member |
+							member spec updateForSpawnMethod: member spec copy ]].
+				strm cr; tab; nextPutAll: 'spec for: ', attribute printString, ' do: ['; cr.
+				attribute == #common
+					ifTrue: [
+						vs 
+							author: MetacelloPlatform current authorName;
+							timestamp: MetacelloPlatform current timestamp.
+						blessing ~~ nil
+							ifTrue: [ vs blessing: blessing ]].
+				vs configSpawnMethodOn: strm indent: 2.
+				strm nextPutAll: '].'].
+				(aConfig class	
+					compile: strm contents
+					classified: methodCategory) == nil 
+						ifTrue: [ self error: 'Error compiling the method' ]].
+	^true
+!
+
+updatePackageMethodIn: aConfig sourceVersion: sourceVersionString
+
+	self deprecated: 'see MetacelloToolBox class>>updateDevelopment:for:updateProjects:description: for replacement method'.
+	self 
+		prepareForMethodUpdate: aConfig 
+		sourceVersion: sourceVersionString 
+		forceUpdate: false
+		generating: [:selector :pragmaMap :ar :updatedPackageSpecsMap | | strm pragma |
+			updatedPackageSpecsMap isEmpty ifTrue: [ ^false ].
+			strm := WriteStream on: String new.
+			strm 
+				nextPutAll: selector asString, ' spec'; cr;
+				tab; nextPutAll: '<version: ', sourceVersionString printString.
+			pragma := pragmaMap at: selector.
+			pragma numArgs = 2
+				ifTrue: [
+					strm nextPutAll: ' imports: #('.
+					(pragma argumentAt: 2) do: [:versionString |
+						strm nextPutAll: versionString printString; space ]].
+			strm nextPutAll: ')>';cr.
+			(ar at: 2) do: [:attribute | | vs d |
+				vs := (ar at: 1) at: attribute.
+				(d := updatedPackageSpecsMap at: attribute ifAbsent: []) ~~ nil
+					ifTrue: [ 
+						vs packagesSpec list do: [:member | 
+							member spec file ~~ nil
+								ifTrue: [ | x |
+									(((x := d at: member spec name ifAbsent: []) ~~ nil) and: [ x ~~ #uptodate ])
+						 				ifTrue: [ member spec file: x file ]]]].
+				strm cr; tab; nextPutAll: 'spec for: ', attribute printString, ' do: ['; cr.
+				attribute == #common
+					ifTrue: [ 
+						vs 
+							author: MetacelloPlatform current authorName;
+							timestamp: MetacelloPlatform current timestamp ].
+				vs configMethodOn: strm indent: 2.
+				strm nextPutAll: '].'].
+			(aConfig class	
+					compile: strm contents
+					classified: (aConfig class whichCategoryIncludesSelector: pragma selector)) == nil
+						ifTrue: [ self error: 'Error compiling the method' ]].
+	^true
+! !
+
+!MetacelloVersionConstructor methodsFor:'initialization'!
+
+calculate: aConfig project: aProject
+    | versionMap symbolicVersionMap executionBlock pragmaDict |
+    self setProject: aProject.
+    self configuration: aConfig.
+    versionMap := Dictionary new.
+    symbolicVersionMap := Dictionary new.
+    executionBlock := self specResolverBlock.
+    self collectAllVersionsFromVersionPragmasInto: versionMap using: executionBlock.
+    pragmaDict := self extractVersionImportPragmas.
+    self verifyVersionImportPragmas: pragmaDict definedIn: versionMap.
+    self collectAllVersionsFromVersionImportPragmasInto: versionMap using: executionBlock satisfiedPragmas: pragmaDict.
+    self collectAllSymbolicVersionsFromVersionPragmasInto: symbolicVersionMap using: self symbolicVersionResolverBlock.
+    self project map: versionMap.
+    self project errorMap: self errorMap.
+    self project symbolicVersionMap: symbolicVersionMap.
+    self project configuration: aConfig.	"now that we have a nearly complete project, we can collect the defaultSymbolicVersions, which expect the project to be fully constructed"
+    self
+        collectDefaultSymbolicVersionsFromVersionPragmasFrom: self extractDefaultSymbolicVersionPragmas
+        into: symbolicVersionMap
+        using: self defaultSymbolicVersionResolverBlock.	"Pick up defaults from MetacelloBaseConfiguration"
+    self
+        collectDefaultSymbolicVersionsFromVersionPragmasFrom: self extractCommonDefaultSymbolicVersionPragmas
+        into: symbolicVersionMap
+        using: self commonDefaultSymbolicVersionResolverBlock.	"now resolive symbolicVersions defined as symbolicVersions"
+    symbolicVersionMap copy
+        keysAndValuesDo: [ :symbolic :original | 
+            | versionString visited |
+            versionString := original.
+            visited := Set new.
+            [ 
+            visited add: versionString.
+            versionString isSymbol and: [ versionString ~~ #'notDefined' ] ]
+                whileTrue: [ 
+                    versionString := symbolicVersionMap
+                        at: versionString
+                        ifAbsent: [ self error: 'Cannot resolve symbolic version ' , original printString ].
+                    (visited includes: versionString)
+                        ifTrue: [ self error: 'Loop detected resolving symbolic version ' , original printString ] ].
+            symbolicVersionMap at: symbolic put: versionString ]
+!
+
+on: aConfig
+
+	| cacheKey |
+	cacheKey := aConfig class.
+	project := MetacelloPlatform current
+		stackCacheFor: #versionConstructor
+		at: cacheKey
+		doing: [ :cache | 
+			self calculate: aConfig project: nil.
+			cache at: cacheKey put:  self project ].
+	self setProject: project.
+!
+
+on: aConfig project: aProject
+    | cacheKey cachedProject |
+    cacheKey := aConfig class.
+    cachedProject := MetacelloPlatform current
+        stackCacheFor: #'versionConstructor'
+        at: cacheKey
+        doing: [ :cache | 
+            self calculate: aConfig project: aProject.
+            cache at: cacheKey put: self project.
+            ^ self ].
+    aProject map: cachedProject map.
+    aProject errorMap: cachedProject errorMap.
+    aProject symbolicVersionMap: cachedProject symbolicVersionMap.
+    aProject configuration: aConfig.
+    self setProject: aProject
+! !
+
+!MetacelloVersionConstructor methodsFor:'private'!
+
+collectAllSymbolicVersionsFromVersionPragmasInto: symbolicVersionMap using: executionBlock
+	| defined versionPragmaDict versionString |
+	versionPragmaDict := self extractSymbolicVersionPragmas.
+	versionPragmaDict
+		keysAndValuesDo: [ :versionSymbol :pragmaColl | 
+			defined := false.
+			pragmaColl
+				do: [ :pragma | 
+					defined := true.
+					versionString := executionBlock value: versionSymbol value: pragma ].
+			defined
+				ifTrue: [ 
+					versionString == nil
+						ifFalse: [ symbolicVersionMap at: versionSymbol put: versionString ]].
+			self reset ]
+!
+
+collectAllVersionsFromVersionImportPragmasInto: versionMap using: executionBlock satisfiedPragmas: pragmaDict
+    | defined done completed count |
+    done := false.
+    completed := IdentitySet new.
+    count := 0.
+    [ 
+    count := count + 1.
+    count > 10000
+        ifTrue: [ self error: 'Apparent loop in import expansion' ].
+    done ]
+        whileFalse: [ 
+            done := true.
+            pragmaDict
+                keysAndValuesDo: [ :versionString :pragmaColl | 
+                    | versionSpec |
+                    versionSpec := nil.
+                    defined := false.
+                    [ 
+                    pragmaColl
+                        do: [ :pragma | 
+                            (completed includes: pragma)
+                                ifFalse: [ 
+                                    | imports |
+                                    done := false.
+                                    imports := pragma argumentAt: 2.
+                                    imports
+                                        detect: [ :importedVersion | (versionMap includesKey: importedVersion) not ]
+                                        ifNone: [ 
+                                            imports
+                                                do: [ :importedVersion | 
+                                                    | version |
+                                                    (version := versionMap at: importedVersion ifAbsent: [  ]) ~~ nil
+                                                        ifTrue: [ 
+                                                            defined := true.
+                                                            completed add: pragma.
+                                                            versionSpec == nil
+                                                                ifTrue: [ versionSpec := version spec copy ]
+                                                                ifFalse: [ versionSpec := versionSpec mergeSpec: version spec copy ].
+                                                            versionSpec versionString: versionString.
+                                                            executionBlock value: versionSpec value: pragma ] ] ] ] ] ]
+                        on: Error
+                        do: [ :ex | 
+                            (MetacelloErrorInProjectConstructionNotification versionString: versionSpec versionString exception: ex)
+                                ifTrue: [ ^ ex pass ]
+                                ifFalse: [ 
+                                    self errorMap at: versionSpec versionString put: ex.
+                                    done := true.
+                                    defined := false ] ].
+                    defined
+                        ifTrue: [ 
+                            | version importedVersions |
+                            importedVersions := OrderedCollection new.
+                            version := versionSpec createVersion.
+                            pragmaColl do: [ :pragma | importedVersions addAll: (pragma argumentAt: 2) ].
+                            version importedVersions: importedVersions.
+                            self validateVersionString: versionString againstSpec: versionSpec.
+                            versionMap at: versionSpec versionString put: version ].
+                    self reset ] ]
+!
+
+collectAllVersionsFromVersionPragmasInto: versionMap using: executionBlock
+    | defined versionPragmaDict |
+    versionPragmaDict := self extractVersionPragmas.
+    versionPragmaDict
+        keysAndValuesDo: [ :versionString :pragmaColl | 
+            | versionSpec |
+            versionSpec := self project versionSpec.
+            versionSpec versionString: versionString.
+            defined := false.
+            [ 
+            pragmaColl
+                do: [ :pragma | 
+                    executionBlock value: versionSpec value: pragma.
+                    defined := true ] ]
+                on: Error
+                do: [ :ex | 
+                    (MetacelloErrorInProjectConstructionNotification versionString: versionSpec versionString exception: ex)
+                        ifTrue: [ ^ ex pass ]
+                        ifFalse: [ 
+                            self errorMap at: versionSpec versionString put: ex.
+                            defined := false ] ].
+            defined
+                ifTrue: [ 
+                    self validateVersionString: versionString againstSpec: versionSpec.
+                    versionMap at: versionSpec versionString put: versionSpec createVersion ].
+            self reset ]
+!
+
+collectDefaultSymbolicVersionsFromVersionPragmasFrom: versionPragmaDict into: symbolicVersionMap using: executionBlock
+	| defined versionString |
+	versionPragmaDict
+		keysAndValuesDo: [ :versionSymbol :pragmaColl | 
+			defined := false.
+			symbolicVersionMap
+				at: versionSymbol
+				ifAbsent: [ 
+					"process the defaultSymbolicVersion only if the symbolicVersion is not defined yet"
+					pragmaColl
+						do: [ :pragma | 
+							defined := true.
+							versionString := executionBlock value: versionSymbol value: pragma ].
+					defined
+						ifTrue: [ 
+							versionString == nil
+								ifFalse: [ symbolicVersionMap at: versionSymbol put: versionString ] ].
+					self reset ] ]
+!
+
+commonDefaultSymbolicVersionResolverBlock
+	^ self defaultSymbolicVersionResolverBlock: (ConfigurationOf new project: self project)
+!
+
+defaultSymbolicVersionResolverBlock
+	^ self defaultSymbolicVersionResolverBlock: self configuration
+!
+
+defaultSymbolicVersionResolverBlock: receiver
+	^ [ :symbolicVrsn :pragma | 
+	| result |
+	result := nil.
+	(pragma argumentAt: 1) = symbolicVrsn
+		ifTrue: [ 
+			self symbolicVersion: symbolicVrsn.
+			result := [ receiver perform: pragma selector ] on: MetacelloVersionDoesNotExistError do: [ :ex | ex return: nil ] ].
+	result ]
+!
+
+specResolverBlock
+	^ [ :versionSpec :pragma | 
+	(pragma argumentAt: 1) = versionSpec versionString
+		ifTrue: [ 
+			self evaluatePragma: pragma.
+			self project attributes
+				do: [ :attribute | 
+					| blockList |
+					(blockList := self attributeMap at: attribute ifAbsent: [  ]) ~~ nil
+						ifTrue: [ blockList do: [ :block | self with: versionSpec during: block ] ] ] ] ]
+!
+
+symbolicVersionResolverBlock
+	^ [ :symbolicVrsn :pragma | 
+	| result |
+	result := nil.
+	(pragma argumentAt: 1) = symbolicVrsn
+		ifTrue: [ 
+			self symbolicVersion: symbolicVrsn.
+			self evaluatePragma: pragma.
+			self project attributes
+				do: [ :attribute | 
+					| versionString |
+					versionString := self attributeMap at: attribute ifAbsent: [  ].
+					versionString ~~ nil
+						ifTrue: [ result := versionString ] ] ].
+	result ]
+!
+
+verifyVersionImportPragmas: pragmaDict definedIn: versionMap
+    pragmaDict copy
+        keysAndValuesDo: [ :versionString :pragmaColl | 
+            [ 
+            pragmaColl
+                do: [ :pragma | 
+                    (pragma argumentAt: 2)
+                        do: [ :importedVersion | 
+                            versionMap
+                                at: importedVersion
+                                ifAbsent: [ 
+                                    pragmaDict
+                                        at: importedVersion
+                                        ifAbsent: [ 
+                                            ^ self
+                                                error:
+                                                    'The imported version:' , importedVersion printString , ' for version: ' , versionString
+                                                        , ' referenced from the method: ' , pragma selector printString
+                                                        , ' in configuration ' , configuration class printString
+                                                        , ' has not been defined.' ] ] ] ] ]
+                on: Error
+                do: [ :ex | 
+                    (MetacelloErrorInProjectConstructionNotification versionString: versionString exception: ex)
+                        ifTrue: [ ^ ex pass ]
+                        ifFalse: [ 
+                            pragmaDict removeKey: versionString.
+                            self errorMap at: versionString put: ex ] ] ]
+! !
+
+!MetacelloVersionConstructor methodsFor:'validation'!
+
+validateVersionString: versionString againstSpec: versionSpec
+
+	versionString = versionSpec versionString
+		ifFalse: [ 
+			MetacelloValidationNotification
+				signal:
+					(MetacelloValidationError
+						configurationClass: self configurationClass
+						reasonCode: #incorrectVersionString
+						callSite: #validateVersionString:againstSpec
+						explanation:
+							'The version declared in the pragma ', versionString printString , ' does not match the version in the spec '
+								, versionSpec versionString printString) ].
+! !
+
+!MetacelloVersionConstructor class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionDefinitionError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,44 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloVersionDoesNotExistError subclass:#MetacelloVersionDefinitionError
+	instanceVariableNames:'exception'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloVersionDefinitionError methodsFor:'accessing'!
+
+exception
+	^ exception
+!
+
+exception: anObject
+	exception := anObject
+! !
+
+!MetacelloVersionDefinitionError methodsFor:'printing'!
+
+description
+    "Return a textual description of the exception."
+
+    ^ 'The version ' , self versionString printString , ' is not defined in ' , self project label
+        , ' for the current platform, because an exception occurred while creating the version:. '
+        , self exception description , '. Evaluate the following to see the error: ''['
+        , self project configuration class name asString
+        ,
+            ' project ] 
+	on: MetacelloErrorInProjectConstructionNotification 
+	do: [:ex | ex resume: true ].'''
+        ,
+            '
+Possible versions include: ' , self possibleVersions printString
+! !
+
+!MetacelloVersionDefinitionError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionDoesNotExistError.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,57 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloVersionDoesNotExistError
+	instanceVariableNames:'project versionString'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloVersionDoesNotExistError class methodsFor:'instance creation'!
+
+project: aMetacelloProject versionString: aVersionString
+
+	^(self new)
+		project: aMetacelloProject;
+		versionString: aVersionString;
+		yourself
+! !
+
+!MetacelloVersionDoesNotExistError methodsFor:'accessing'!
+
+possibleVersions
+    ^ self project symbolicVersionSymbols , (self project versions collect: [ :each | each versionString ])
+!
+
+project
+	^ project
+!
+
+project: anObject
+	project := anObject
+!
+
+versionString
+	^ versionString
+!
+
+versionString: anObject
+	versionString := anObject
+! !
+
+!MetacelloVersionDoesNotExistError methodsFor:'printing'!
+
+description
+    "Return a textual description of the exception."
+
+    ^ 'Version ' , self versionString printString , ' is not defined in ' , self project label
+        , '. Possible versions include: ' , self possibleVersions printString
+! !
+
+!MetacelloVersionDoesNotExistError class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionMethodSection.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,75 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMethodSection subclass:#MetacelloVersionMethodSection
+	instanceVariableNames:'block versionSpec parent methodSections'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloVersionMethodSection methodsFor:'accessing'!
+
+addMethodSection: methodSection
+
+	methodSection parent: self.
+	self methodSections add: methodSection
+!
+
+attributeOrPath
+	| path |
+	^self parent == nil
+		ifTrue: [ self attribute ]
+		ifFalse: [ self parent attributePath , {(self attribute)} ]
+!
+
+attributePath
+	| path |
+	path := {self attribute.}.
+	^self parent == nil
+		ifTrue: [ path ]
+		ifFalse: [ self parent attributePath , path ]
+!
+
+block
+	^ block
+!
+
+block: anObject
+	block := anObject
+!
+
+methodSections
+
+	methodSections ifNil: [ methodSections := OrderedCollection new ].
+	^methodSections
+!
+
+parent
+	^ parent
+!
+
+parent: anObject
+	parent := anObject
+!
+
+topParent
+	self parent == nil
+		ifTrue: [ ^ self ].
+	^ self parent topParent
+!
+
+versionSpec
+	^ versionSpec
+!
+
+versionSpec: anObject
+	versionSpec := anObject
+! !
+
+!MetacelloVersionMethodSection class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionMethodSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,164 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMethodSpec subclass:#MetacelloVersionMethodSpec
+	instanceVariableNames:'imports'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloVersionMethodSpec methodsFor:'accessing'!
+
+imports
+	imports == nil ifTrue: [ imports := #() ].
+	^ imports
+!
+
+imports: anObject
+	imports := anObject
+!
+
+versionString: aStringOrSymbol
+
+	aStringOrSymbol isSymbol ifTrue: [ self error: 'Version string ', aStringOrSymbol printString, ' for version method must be a String' ].
+	super versionString: aStringOrSymbol
+! !
+
+!MetacelloVersionMethodSpec methodsFor:'adding'!
+
+addMethodSection: attributeOrPath versionSpec: versionSpec
+	| attribute methodSection index sections found |
+	attributeOrPath isArray
+		ifTrue: [ attribute := attributeOrPath last ]
+		ifFalse: [ attribute := attributeOrPath ].
+	methodSection := (MetacelloVersionMethodSection new)
+		attribute: attribute;
+		versionSpec: versionSpec;
+		yourself.
+	attributeOrPath isArray
+		ifTrue: [ 
+			index := 1.
+			sections := self methodSections.
+			found := true.
+			[ found ]
+				whileTrue: [ 
+					found := false.
+					sections
+						do: [ :ms | 
+							ms attribute == (attributeOrPath at: index)
+								ifTrue: [ 
+									index == (attributeOrPath size -1 )
+										ifTrue: [ 
+											ms methodSections add: methodSection.
+											^ self ].
+									sections := ms methodSections.
+									index := index + 1.
+									found := true ] ] ].
+			self error: 'Method section for attribute: ' , (attributeOrPath at: index) printString , ' not found.' ]
+		ifFalse: [ self methodSections add: methodSection ]
+!
+
+findMethodSection: attributeOrPath
+	| attribute index sections found |
+	attributeOrPath isArray
+		ifTrue: [ attribute := attributeOrPath last ]
+		ifFalse: [ attribute := attributeOrPath ].
+	attributeOrPath isArray
+		ifTrue: [ 
+			index := 1.
+			sections := self methodSections.
+			found := true.
+			[ found ]
+				whileTrue: [ 
+					found := false.
+					sections
+						do: [ :ms | 
+							ms attribute == (attributeOrPath at: index)
+								ifTrue: [ 
+									index == (attributeOrPath size - 1)
+										ifTrue: [ ^ ms ].
+									sections := ms methodSections.
+									index := index + 1.
+									found := true ] ] ].
+			self error: 'Method section for attribute: ' , (attributeOrPath at: index) printString , ' not found.' ]
+		ifFalse: [ 
+			^ self methodSections
+				detect: [ :methodSection | methodSection attribute == attribute ]
+				ifNone: [ self error: 'Method section for attribute: ' , attribute printString , ' not found.' ] ]
+! !
+
+!MetacelloVersionMethodSpec methodsFor:'method generation'!
+
+methodSelectorAndPragma: aSelector imports: importList versionString: aString on: strm
+	strm
+		nextPutAll: aSelector asString , ' spec';
+		cr;
+		tab;
+		nextPutAll: '<version: ' , aString printString.
+	importList notEmpty
+		ifTrue: [ 
+			strm nextPutAll: ' imports: #('.
+			importList
+				do: [ :importVersionString | 
+					strm
+						nextPutAll: importVersionString printString;
+						space ].
+			strm nextPut: $) ].
+	strm
+		nextPutAll: '>';
+		cr
+!
+
+methodSource
+	| strm |
+	strm := WriteStream on: String new.
+	self
+		methodSelectorAndPragma: self selector
+		imports: self imports
+		versionString: self versionString
+		on: strm.
+	self
+		methodSection: self
+		pre: [ :methodSection :indent | 
+			strm
+				cr;
+				tab: indent;
+				nextPutAll: 'spec for: #' , methodSection attribute asString printString , ' do: [';
+				cr.
+			methodSection versionSpec configMethodOn: strm last: methodSection methodSections isEmpty indent: indent + 1 ]
+		last: false
+		post: [ :methodSection :indent  :last | 
+			strm nextPutAll: ' ].'.
+			(last or: [ (indent = 1 or: [(methodSection methodSections isEmpty and: [ indent = 1 ])]) ])
+				ifTrue: [ strm cr ] ]
+		indent: 0.
+	^ strm contents
+! !
+
+!MetacelloVersionMethodSpec methodsFor:'private'!
+
+methodSection: methodSection pre: preBlock last: last post: postBlock indent: indent
+	| list |
+	methodSection ~~ self
+		ifTrue: [ preBlock value: methodSection value: indent ].
+	list := methodSection methodSections.
+	1 to: list size
+		do: [ :index | | ms | 
+			ms := list at: index.
+			self
+				methodSection: ms
+				pre: preBlock
+				last: index ~= list size
+				post: postBlock
+				indent: indent + 1 ].
+	methodSection ~~ self
+		ifTrue: [ postBlock value: methodSection value: indent value: last ]
+! !
+
+!MetacelloVersionMethodSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionNumber.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,345 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Magnitude variableSubclass:#MetacelloVersionNumber
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Model'
+!
+
+
+!MetacelloVersionNumber class methodsFor:'instance creation'!
+
+fromString: aString
+
+	| new components |
+	components := OrderedCollection new.
+	(aString findTokens: '.') do: [:subString | | strs |
+		strs := subString findTokens: '-'.
+		"first subString token could be an integer"
+		components add: (self extractNumericComponent: strs first).
+		strs size > 1
+			ifTrue: [
+				"remaining are uncoditionally Strings, because of leading $-"
+				components addAll: strs allButFirst ]].
+	new := self new: components size.
+	1 to: components size do: [:i | new at: i put: (components at: i) ].
+	^new
+! !
+
+!MetacelloVersionNumber class methodsFor:'private'!
+
+extractNumericComponent: subString
+	"$. separated components are integers"
+
+	| number |
+	number := [subString asNumber] 
+						on: Error 
+						do: [:ex | ex return: subString ].
+	^number asString = subString
+		ifTrue: [ number ]
+		ifFalse: [ subString ]
+! !
+
+!MetacelloVersionNumber methodsFor:'accessing'!
+
+approximateBase
+
+	| base |
+	base := self copyFrom: 1 to: self size - 1.
+	base at: base size put: (base at: base size) + 1.
+	^base
+!
+
+versionString
+
+	| strm |
+	strm := WriteStream on: String new.
+	self printOn: strm.
+	^strm contents
+! !
+
+!MetacelloVersionNumber methodsFor:'comparing'!
+
+< aMetacelloVersionNumber
+
+	| condensed aCondensed |
+	aMetacelloVersionNumber species = self species
+		ifFalse: [ ^ false ].
+	condensed := self collapseZeros.
+	aCondensed := aMetacelloVersionNumber collapseZeros.
+	(condensed ~~ self or: [ aCondensed ~~ aMetacelloVersionNumber ])
+		ifTrue: [ ^ condensed compareLessThan: aCondensed ].
+	^ self compareLessThan: aMetacelloVersionNumber
+!
+
+= aMetacelloVersionNumber
+
+	| condensed aCondensed |
+	aMetacelloVersionNumber species = self species
+		ifFalse: [ ^ false ].
+	condensed := self collapseZeros.
+	aCondensed := aMetacelloVersionNumber collapseZeros.
+	(condensed ~~ self or: [ aCondensed ~~ aMetacelloVersionNumber ])
+		ifTrue: [ ^ condensed compareEqualTo: aCondensed ].
+	^ self compareEqualTo: aMetacelloVersionNumber
+!
+
+hash
+
+"Returns a numeric hash key for the receiver."
+
+| mySize interval hashValue |
+
+(mySize := self size) == 0
+  ifTrue: [ ^15243 ].
+
+"Choose an interval so that we sample at most 5 elements of the receiver"
+interval := ((mySize - 1) // 4) max: 1.
+
+hashValue := 4459.
+1 to: mySize by: interval do: [ :i | | anElement |
+  anElement := self at: i.
+  (anElement isKindOf: SequenceableCollection)
+    ifTrue: [
+      hashValue := (hashValue bitShift: -1) bitXor: anElement size.
+      ]
+    ifFalse: [
+      hashValue := (hashValue bitShift: -1) bitXor: anElement hash.
+      ].
+  ].
+
+^ hashValue abs
+!
+
+match: aVersionPattern
+	"Answer whether the version number of the receiver matches the given pattern string.
+
+	 A Metacello version number is made up of version sequences delimited by the characters $. and $-.
+	 The $. introduces a numeric version sequence and $- introduces an alphanumeric version sequence.
+	 
+	 A version pattern is made up of version pattern match sequences. also delimited by the characters $. 
+	 and $-.. Each pattern match sequence is tested against the corresponding version sequence of the 
+	 receiver, using the 'standard' pattern matching rules. All sequences must answer true for a match.
+	
+	 The special pattern sequence '?' is a match for the corresponding version sequence and all subsequent 
+	 version sequences. '?' as the version pattern matches all versions. No more version pattern 
+	 sequences are permitted once the '?' sequence is used. If used, it is the last version pattern
+	 sequence. "
+	
+	| patternVersion mySize patternSize |
+	patternVersion := aVersionPattern asMetacelloVersionNumber.
+	mySize := self size.
+	patternSize := patternVersion size.
+	mySize = patternSize 
+		ifFalse: [ 
+			mySize < patternSize ifTrue: [ ^false ].
+			(patternVersion at: patternSize) ~= '?' ifTrue: [ ^false ].
+			mySize := patternSize ].
+	1 to: mySize do: [:i | | pattern |
+		pattern := (patternVersion at: i) asString.
+		pattern = '?'
+			ifTrue: [i = mySize ifFalse: [ ^self error: 'Invalid version match pattern: ', aVersionPattern printString ]]
+			ifFalse: [ (pattern match: (self at: i) asString)  ifFalse: [ ^false ]]].
+	^true
+"
+  '1.1.1' asMetacelloVersionNumber match: '*.*.*'. -> true
+  '1.1.1' asMetacelloVersionNumber match: '*.#.*'. -> true
+  '1.10.1' asMetacelloVersionNumber match: '*.#.*'. -> false
+  '1.1.1' asMetacelloVersionNumber match: '*.*'. -> false
+  '1.1.1' asMetacelloVersionNumber match: '*.?'. -> true
+  '1.0' asMetacelloVersionNumber match: '1.?'. -> true
+  '2.0' asMetacelloVersionNumber match: '1.?'. -> false
+  '1.1.1' asMetacelloVersionNumber match: '?'. -> true
+  '1' asMetacelloVersionNumber match: '*.?'. -> false
+  '1-alpha5.0' asMetacelloVersionNumber match: '1-alpha*.?'. -> true
+  '1-alpha15.0.1' asMetacelloVersionNumber match: '1-alpha*.?'. -> true
+  '1.1' asMetacelloVersionNumber match: '?.?'. -> ERROR: invalid version match pattern
+"
+!
+
+~> aMetacelloVersionNumber
+
+	aMetacelloVersionNumber size == 1 ifTrue: [ ^false ].
+	^self >= aMetacelloVersionNumber and: [ self < aMetacelloVersionNumber approximateBase ]
+! !
+
+!MetacelloVersionNumber methodsFor:'converting'!
+
+asMetacelloVersionNumber
+
+	^self
+! !
+
+!MetacelloVersionNumber methodsFor:'copying'!
+
+copyFrom: start to: stop 
+	"Answer a copy of a subset of the receiver, starting from element at 
+	index start until element at index stop."
+
+	| newSize new j |
+	newSize := stop - start + 1.
+	new := self species new: newSize.
+	j := 0.
+	start to: stop do: [:i |
+		new at: j + 1 put: (self at: i).
+		j := j + 1 ].
+	^new
+! !
+
+!MetacelloVersionNumber methodsFor:'enumerating'!
+
+do: aBlock 
+	"Refer to the comment in Collection|do:."
+	1 to: self size do:
+		[:index | aBlock value: (self at: index)]
+!
+
+do: elementBlock separatedBy: separatorBlock
+	"Evaluate the elementBlock for all elements in the receiver,
+	and evaluate the separatorBlock between."
+
+	| beforeFirst | 
+	beforeFirst := true.
+	self do:
+		[:each |
+		beforeFirst
+			ifTrue: [beforeFirst := false]
+			ifFalse: [separatorBlock value].
+		elementBlock value: each]
+! !
+
+!MetacelloVersionNumber methodsFor:'operations'!
+
+decrementMinorVersionNumber
+	| int |
+	self size to: 1 by: -1 do: [ :index | 
+		(int := self at: index) isString
+			ifFalse: [ 
+				int > 0
+					ifTrue: [ self at: index put: int - 1 ].
+				^ self ] ]
+!
+
+incrementMinorVersionNumber
+
+	| int |
+	self size to: 1 by: -1 do: [:index | 
+		(int := self at: index) isString 
+			ifFalse: [ 
+				self at: index put: int + 1.
+				^self ]].
+! !
+
+!MetacelloVersionNumber methodsFor:'printing'!
+
+asString
+	"Answer a string that represents the receiver."
+
+	^ self printString
+!
+
+printOn: aStream
+
+	| beforeFirst | 
+	beforeFirst := true.
+	self do:
+		[:each |
+		beforeFirst
+			ifTrue: [beforeFirst := false]
+			ifFalse: [
+				each isString
+					ifTrue: [ aStream nextPut: $- ]
+					ifFalse: [ aStream nextPut: $. ] ].
+		aStream nextPutAll: each asString ]
+! !
+
+!MetacelloVersionNumber methodsFor:'private'!
+
+collapseZeros
+	"the rule must be that zeros can be collapsed as long as the series of zeros ends in a string term"
+
+	| collection newSize new j lastElementIsStringOrZero canCollapse |
+	(self size = 0 or: [ self at: 1 ]) == 0
+		ifTrue: [ ^ self ].
+	collection := OrderedCollection new.
+	lastElementIsStringOrZero := true.
+	canCollapse := true.
+	self size to: 1 by: -1 do: [ :i | 
+		| element |
+		element := self at: i.
+		(canCollapse and: [ element == 0 ])
+			ifTrue: [ 
+				lastElementIsStringOrZero
+					ifFalse: [ 
+						canCollapse := false.
+						collection addFirst: element.]]
+			ifFalse: [ 
+				collection addFirst: element.
+				canCollapse := lastElementIsStringOrZero := element isString ] ].
+	collection size = self size
+		ifTrue: [ ^ self ].
+	newSize := collection size.
+	new := self species new: newSize.
+	j := 0.
+	collection
+		do: [ :element | 
+			new at: j + 1 put: element.
+			j := j + 1 ].
+	^ new
+!
+
+compareEqualTo: aMetacelloVersionNumber
+
+	| mySize |
+	aMetacelloVersionNumber species = self species ifFalse: [ ^false ].
+	mySize := self size.
+	mySize = aMetacelloVersionNumber size 
+		ifFalse: [ ^false ].
+	1 to: mySize do: [:i |
+		(self at: i) = (aMetacelloVersionNumber at: i) ifFalse: [ ^false ]].
+	^true
+!
+
+compareLessThan: aMetacelloVersionNumber
+
+	| mySize aSize commonSize count more |
+	mySize := self size.
+	aSize := aMetacelloVersionNumber size.
+	commonSize :=  mySize min: aSize.
+	count := 0.
+	more := true.
+	[ more and: [ count < commonSize ]] whileTrue: [
+		(self at: count + 1) = (aMetacelloVersionNumber at: count + 1)
+			ifTrue: [ count := count + 1 ]
+			ifFalse: [ more := false ]].
+	count < commonSize
+		ifTrue: [ 
+			^(self at: count + 1) 
+				metacelloVersionComponentLessThan: (aMetacelloVersionNumber at: count + 1) ].
+	mySize < aSize
+		ifTrue: [ 
+			mySize = 0 ifTrue: [ ^true ].
+			"if the versions at commonSize are equal and the next version slot in aMetacelloVersionNumber 
+			 is a string, then it's considered that I'm > aMetacelloVersionNumber
+			 (i.e., '2.9.9' is greater than '2.9.9-alpha.2')"
+			(self at: commonSize) = (aMetacelloVersionNumber at: commonSize)
+				ifFalse: [ ^true ]. 
+			^(aMetacelloVersionNumber at: commonSize+1) isString not]
+		ifFalse: [ 
+			mySize = aSize ifTrue: [ ^false ].
+			aSize <= 0 ifTrue: [ ^false ].
+			"if the versions at commonSize are equal and the next version slot is a string, 
+			 then it's considered that I'm < aMetacelloVersionNumber
+			 (i.e., '2.9.9-alpha.2' is less than '2.9.9')"
+			(self at: commonSize) = (aMetacelloVersionNumber at: commonSize)
+				ifFalse: [ ^false ].
+			 ^(self at: commonSize+1) isString]
+! !
+
+!MetacelloVersionNumber class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,359 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloVersionSpec
+	instanceVariableNames:'versionString blessing description author timestamp preLoadDoIt
+		postLoadDoIt'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloVersionSpec methodsFor:'accessing'!
+
+author
+
+	author == nil 
+		ifTrue: [
+			^self project valueHolderSpec
+				value: '';
+				yourself].
+	^ author
+!
+
+author: anObject
+
+	anObject setAuthorInMetacelloVersion: self
+!
+
+blessing
+
+	blessing == nil 
+		ifTrue: [
+			^self project valueHolderSpec
+				value: self project defaultBlessing;
+				yourself].
+	^ blessing
+!
+
+blessing: anObject
+
+	anObject setBlessingInMetacelloVersion: self
+!
+
+description
+
+	description == nil 
+		ifTrue: [
+			^self project valueHolderSpec
+				value: '';
+				yourself].
+	^ description
+!
+
+description: anObject
+
+	anObject setDescriptionInMetacelloVersion: self
+!
+
+getAuthor
+	^author
+!
+
+getBlessing
+	^blessing
+!
+
+getDescription
+	^description
+!
+
+getPostLoadDoIt
+	^postLoadDoIt
+!
+
+getPreLoadDoIt
+	^preLoadDoIt
+!
+
+getTimestamp
+	^timestamp
+!
+
+postLoadDoIt: anObject
+
+	anObject setPostLoadDoItInMetacelloSpec: self
+!
+
+preLoadDoIt: anObject
+
+	anObject setPreLoadDoItInMetacelloSpec: self
+!
+
+projectLabel
+
+	^self project label
+!
+
+setAuthor: anObject
+	author := anObject
+!
+
+setBlessing: anObject
+	blessing := anObject
+!
+
+setDescription: anObject
+	description := anObject
+!
+
+setPostLoadDoIt: aSymbol
+
+	postLoadDoIt := aSymbol
+!
+
+setPreLoadDoIt: aSymbol
+
+	preLoadDoIt := aSymbol
+!
+
+setTimestamp: anObject
+	timestamp := anObject
+!
+
+timestamp
+
+	timestamp == nil 
+		ifTrue: [
+			^self project valueHolderSpec
+				value: '';
+				yourself].
+	^ timestamp
+!
+
+timestamp: anObject
+
+	anObject setTimestampInMetacelloVersion: self
+!
+
+versionString: anObject
+	versionString := anObject
+! !
+
+!MetacelloVersionSpec methodsFor:'construction'!
+
+author: aBlockOrString constructor: aVersionConstructor
+    aVersionConstructor authorForVersion: aBlockOrString
+!
+
+blessing: aBlockOrString constructor: aVersionConstructor
+    aVersionConstructor blessingForVersion: aBlockOrString
+!
+
+description: aBlockOrString constructor: aVersionConstructor
+    aVersionConstructor descriptionForVersion: aBlockOrString
+!
+
+postLoadDoIt: aSymbol constructor: aVersionConstructor
+    aVersionConstructor postLoadDoItForVersion: aSymbol
+!
+
+preLoadDoIt: aSymbol constructor: aVersionConstructor
+    aVersionConstructor preLoadDoItForVersion: aSymbol
+!
+
+repositories: aBlock constructor: aVersionConstructor
+    aVersionConstructor repositoriesForVersion: aBlock
+!
+
+repository: anObject constructor: aVersionConstructor
+    aVersionConstructor repositoryForVersion: anObject
+!
+
+repository: aString username: username password: password constructor: aVersionConstructor
+    aVersionConstructor repositoryForVersion: aString username: username password: password
+!
+
+timestamp: aBlockOrStringOrDateAndTime constructor: aVersionConstructor
+    aVersionConstructor timestampForVersion: aBlockOrStringOrDateAndTime
+! !
+
+!MetacelloVersionSpec methodsFor:'copying'!
+
+postCopy
+
+	super postCopy.
+	blessing := blessing copy.
+	description := description copy.
+	author := author copy.
+	timestamp := timestamp copy.
+	
+! !
+
+!MetacelloVersionSpec methodsFor:'merging'!
+
+mergeMap
+
+	| map |
+	map := super mergeMap.
+	map at: #versionString put: versionString.
+	map at: #blessing put: blessing.
+	map at: #description put: description.
+	map at: #author put: author.
+	map at: #timestamp put: timestamp.
+	map at: #preLoadDoIt put: preLoadDoIt.
+	map at: #postLoadDoIt put: postLoadDoIt.
+	^map
+! !
+
+!MetacelloVersionSpec methodsFor:'printing'!
+
+configMethodOn: aStream for: spec selector: selector last: last indent: indent
+	spec == nil
+		ifTrue: [ ^ self ].
+	aStream
+		tab: indent;
+		nextPutAll: 'spec ' , selector , ' [';
+		cr.
+	spec configMethodOn: aStream indent: indent + 1.
+	aStream nextPutAll: ' ].'.
+	last
+		ifFalse: [ aStream cr ]
+!
+
+configMethodOn: aStream indent: indent
+
+	self configMethodOn: aStream last: true indent: indent
+!
+
+configMethodOn: aStream last: last indent: indent
+	| values lastIndex lastBlock |
+	last
+		ifTrue: [ 
+			"need to calculate last statement with a value"
+			values := {(self getBlessing).
+			(self getDescription).
+			(self getPreLoadDoIt).
+			(self getPostLoadDoIt).
+			(self getAuthor).
+			(self getTimestamp)}.
+			1 to: values size do: [ :index | 
+				(values at: index) ~~ nil
+					ifTrue: [ lastIndex := index ] ].
+			lastBlock := [ :arg | arg = lastIndex ] ]
+		ifFalse: [ lastBlock := [ :arg | false ] ].
+	self
+		configMethodValueOn: aStream
+		for: self getBlessing
+		selector: 'blessing:'
+		last: (lastBlock value: 1)
+		indent: indent.
+	self
+		configMethodValueOn: aStream
+		for: self getDescription
+		selector: 'description:'
+		last: (lastBlock value: 2)
+		indent: indent.
+	self
+		configMethodValueOn: aStream
+		for: self getPreLoadDoIt
+		selector: 'preLoadDoIt:'
+		last: (lastBlock value: 3)
+		indent: indent.
+	self
+		configMethodValueOn: aStream
+		for: self getPostLoadDoIt
+		selector: 'postLoadDoIt:'
+		last: (lastBlock value: 4)
+		indent: indent.
+	self
+		configMethodValueOn: aStream
+		for: self getAuthor
+		selector: 'author:'
+		last: (lastBlock value: 5)
+		indent: indent.
+	self
+		configMethodValueOn: aStream
+		for: self getTimestamp
+		selector: 'timestamp:'
+		last: (lastBlock value: 6)
+		indent: indent
+!
+
+configMethodValueOn: aStream for: spec selector: selector last: last indent: indent
+	| valuePrintString |
+	spec == nil
+		ifTrue: [ ^ self ].
+	valuePrintString := spec value isSymbol
+		ifTrue: [ '#' , spec value asString printString ]
+		ifFalse: [ spec value printString ].
+	aStream
+		tab: indent;
+		nextPutAll: 'spec ' , selector , ' ' , valuePrintString , '.'.
+	last
+		ifFalse: [ aStream cr ]
+!
+
+configSpawnMethodOn: aStream indent: indent
+
+	self configMethodValueOn: aStream for: self getBlessing selector: 'blessing:' last: false indent: indent.
+	self configMethodValueOn: aStream for: self getAuthor selector: 'author:' last: false indent: indent.
+	self configMethodValueOn: aStream for: self getTimestamp selector: 'timestamp:' last: false indent: indent.
+
+!
+
+label
+
+	^self versionString, ' [', self projectLabel, ']'
+! !
+
+!MetacelloVersionSpec methodsFor:'private'!
+
+createVersion
+
+	^self versionClass fromSpec: self
+!
+
+versionClass
+
+	^MetacelloVersion
+!
+
+versionNumber
+    ^ self project versionNumberClass fromString: self versionString
+! !
+
+!MetacelloVersionSpec methodsFor:'querying'!
+
+postLoadDoIt
+
+	^postLoadDoIt
+!
+
+preLoadDoIt
+
+	^preLoadDoIt
+!
+
+versionString
+	versionString == nil ifTrue: [ ^'' ].
+	^ versionString
+! !
+
+!MetacelloVersionSpec methodsFor:'testing'!
+
+isPartiallyCurrent: notLoadedMatters useEquality: useEquality
+
+	self subclassResponsibility
+!
+
+isPossibleBaseline
+    self subclassResponsibility
+! !
+
+!MetacelloVersionSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionValidator.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,604 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractConstructor subclass:#MetacelloVersionValidator
+	instanceVariableNames:'configurationClass exludededValidations validationReport recurse
+		debug visited'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-Core-Validation'
+!
+
+MetacelloVersionValidator class instanceVariableNames:'reasonCodeDescriptions'
+
+"
+ No other class instance variables are inherited by this class.
+"
+!
+
+
+!MetacelloVersionValidator class methodsFor:'instance creation'!
+
+validateConfiguration: configurationClass
+
+	^self validateConfiguration: configurationClass debug: #() recurse: false
+!
+
+validateConfiguration: configurationClass debug: debugList recurse: aBool
+	^ ((self new)
+		configurationClass: configurationClass;
+		debug: debugList;
+		recurse: aBool;
+		yourself) validate
+!
+
+validateConfiguration: configurationClass recurse: aBool
+
+	^self validateConfiguration: configurationClass debug: #() recurse: aBool
+!
+
+validateProject: aMetacelloProject
+
+	^self validateProject: aMetacelloProject debug: #() recurse: false
+!
+
+validateProject: aMetacelloProject debug: debugList recurse: aBool
+	^ ((self new)
+		recurse: aBool;
+		debug: debugList;
+		configurationClass: aMetacelloProject configuration class;
+		yourself) validateProject: aMetacelloProject
+!
+
+validateProject: aMetacelloProject recurse: aBool
+
+	^self validateProject: aMetacelloProject debug: #() recurse: aBool
+!
+
+validateProject: aMetacelloProject version: versionString
+
+	^self validateProject: aMetacelloProject version: versionString debug: #() recurse: false
+!
+
+validateProject: aMetacelloProject version: versionString debug: debugList
+
+	^self validateProject: aMetacelloProject version: versionString debug: debugList recurse: false
+!
+
+validateProject: aMetacelloProject version: versionString debug: debugList recurse: aBool
+
+	^ ((self new)
+		configurationClass: aMetacelloProject configuration class;
+		debug: debugList;
+		recurse: aBool;
+		yourself) validateProject: aMetacelloProject version: versionString
+!
+
+validateProject: aMetacelloProject version: versionString debug: debugList recurse: aBool visited: visitied
+
+	^(self new
+		configurationClass: aMetacelloProject configuration class;
+		debug: debugList;
+		recurse: aBool;
+		visited: visitied;
+		yourself) validateProject: aMetacelloProject version: versionString
+! !
+
+!MetacelloVersionValidator class methodsFor:'accessing'!
+
+descriptionForReasonCode: reasonCode
+	^ self reasonCodeDescriptions at: reasonCode ifAbsent: [ self error: 'Unknown reasonCode: ' , reasonCode printString ]
+!
+
+reasonCodeDescriptions
+
+	reasonCodeDescriptions ifNil: [ reasonCodeDescriptions := self populateReasonCodeDescriptions ].
+	^reasonCodeDescriptions
+! !
+
+!MetacelloVersionValidator class methodsFor:'private'!
+
+populateReasonCodeDescriptions
+    "update MetacelloMCVersionValidator class comment to include any changes to descriptions"
+
+    | dict |
+    dict := Dictionary new.
+    dict
+        at: #'onlyBaselineVersion'
+        put: 'one or more baseline versions have been defined, but no non-baseline versions are defined.'.
+    dict
+        at: #'duplicateVersionDefinitions' put: 'there are multiple pragma methods specifying the same version.';
+        at: #'packageNameMismatch' put: 'the name in the packageSpec does not match the name of the mcz file.';
+        at: #'projectClassNameFileMismatch'
+            put: 'the class name of the configuration does not match the mcz file containing the configuration.';
+        at: #'cannotResolveVersion'
+            put: 'the version (project reference or symbolic version) was not found in the specified configuration.'.
+    dict
+        at: #'duplicateNames'
+            put: 'multiple independent definitions for an entity with same name (project, package, or group).';
+        at: #'incompleteProjectSpec' put: 'missing required fields in project reference (repository, className).';
+        at: #'incorrectVersionString' put: 'the version declared in pragma doesn''t match version in versionSpec.';
+        at: #'invalidDoItSelector' put: 'doit select must be a Symbol.';
+        at: #'invalidVersionString' put: 'versionString must be a String.';
+        at: #'missingVersionImport' put: 'version specified in import pragma not defined in configuration.';
+        at: #'noVersionsDefined'
+            put: 'no usable baseline or version defined in configuration ... configuration cannot be loaded.';
+        at: #'projectCreationError' put: 'error occured while resolving project reference.';
+        at: #'versionCreationError'
+            put:
+                'error occured while resolving version specification, error will be thrown if an attempt is made to use the version.';
+        at: #'shadowedNames' put: 'name duplication between packages and projects.';
+        at: #'versionCompositionError' put: 'error while creating versionSpec from pragmas.'.
+    ^ dict
+! !
+
+!MetacelloVersionValidator methodsFor:'accessing'!
+
+configurationClass
+	^ configurationClass
+!
+
+configurationClass: anObject
+	configurationClass := anObject
+!
+
+debug
+
+	debug == nil ifTrue: [ debug := #() ].
+	^ debug
+!
+
+debug: aCollection
+	"Any combination of: #error, #criticalWarning, #warning"
+
+	debug := aCollection
+!
+
+exludededValidations
+
+	exludededValidations == nil ifTrue: [ exludededValidations := self extractExcludedValidations ].
+	^exludededValidations
+!
+
+recordValidationCriticalWarning: aString callSite: callSite reasonCode: aSymbol
+
+	^self recordValidationCriticalWarning: aString versionString: nil callSite: callSite reasonCode: aSymbol
+!
+
+recordValidationCriticalWarning: aString versionString: versionString callSite: callSite reasonCode: aSymbol
+	"reasonCodes:
+		#packageNameMismatch
+		#projectClassNameFileMismatch
+		#duplicateVersionDefinitions
+		#duplicateAttributeBlocks
+	"
+
+	(self criticalWarningReasonCodes includes: aSymbol)
+		ifFalse: [ self error: 'Unknown critical warning reason code' ].
+	((self exludededValidations at: versionString ifAbsent: [ #() ]) includes: aSymbol)
+		ifTrue: [ ^self ].
+	(self debug includes: #criticalWarning) ifTrue: [ self halt: 'Debug triggered for critical warning: ', aString ].
+	self validationReport
+		add:
+			(MetacelloValidationCriticalWarning
+				configurationClass:
+					(self recurse
+						ifTrue: [ self configurationClass ]
+						ifFalse: [ nil ])
+				reasonCode: aSymbol
+				callSite: callSite
+				explanation: aString)
+!
+
+recordValidationError: aString callSite: callSite reasonCode: aSymbol
+
+	^self recordValidationError: aString versionString: nil callSite: callSite reasonCode: aSymbol
+!
+
+recordValidationError: aString versionString: versionString callSite: callSite reasonCode: aSymbol
+	"reasonCodes:
+		#noVersionForSymbolicVersion
+		#duplicateNames
+		#shadowedNames
+		#invalidDoItSelector
+		#invalidVersionString
+		#missingVersionImport
+		#projectCreationError
+		#noVersionsDefined
+		#cannotResolveVersion
+		#incompleteProjectSpec
+		#incorrectVersionString
+	"
+
+	(self errorReasonCodes includes: aSymbol)
+		ifFalse: [ self error: 'Unknown error reason code' ].
+	((self exludededValidations at: versionString ifAbsent: [ #() ]) includes: aSymbol)
+		ifTrue: [ ^self ].
+	(self debug includes: #error) ifTrue: [ self halt: 'Debug triggered for error: ', aString ].
+	self validationReport
+		add:
+			(MetacelloValidationError
+				configurationClass:
+					(self recurse
+						ifTrue: [ self configurationClass ]
+						ifFalse: [ nil ])
+				reasonCode: aSymbol
+				callSite: callSite
+				explanation: aString)
+!
+
+recordValidationWarning: aString callSite: callSite reasonCode: aSymbol
+
+				
+	^self recordValidationWarning: aString versionString: nil callSite: callSite reasonCode: aSymbol
+!
+
+recordValidationWarning: aString versionString: versionString callSite: callSite reasonCode: aSymbol
+	"reasonCodes:
+		#onlyBaselineVersion
+		#noVersionSpecified
+	"
+
+	(self warningReasonCodes includes: aSymbol)
+		ifFalse: [ self error: 'Unknown warning reason code' ].
+	((self exludededValidations at: versionString ifAbsent: [ #() ]) includes: aSymbol)
+		ifTrue: [ ^self ].
+	(self debug includes: #warning) ifTrue: [ self halt: 'Debug triggered for critical warning: ', aString ].
+	self validationReport
+		add:
+			(MetacelloValidationWarning
+				configurationClass:
+					(self recurse
+						ifTrue: [ self configurationClass ]
+						ifFalse: [ nil ])
+				reasonCode: aSymbol
+				callSite: callSite
+				explanation: aString)
+!
+
+recurse
+	recurse == nil ifTrue: [ recurse := false ].
+	^ recurse
+!
+
+recurse: anObject
+	recurse := anObject
+!
+
+validationReport
+	
+	validationReport == nil ifTrue: [ validationReport := OrderedCollection new ].
+	^ validationReport
+!
+
+validationReport: anObject
+	validationReport := anObject
+!
+
+visited
+
+	visited == nil ifTrue: [ visited := IdentitySet new ].
+	^visited
+!
+
+visited: anIdentitySet
+
+	visited := anIdentitySet
+! !
+
+!MetacelloVersionValidator methodsFor:'pragma extraction'!
+
+extractExcludedValidations
+
+	| exclusionDict |
+	exclusionDict := Dictionary new.
+	(Pragma 
+		allNamed: #excludedValidationIssues:
+		in: self configurationClass) do: [:pragma | | exclusions |
+			exclusions := pragma argumentAt: 1.
+			1 to: exclusions size by: 2 do: [:index |
+			exclusionDict 
+				at: (exclusions at: index) 
+				put: (exclusions at: index + 1) ]].
+	^exclusionDict
+! !
+
+!MetacelloVersionValidator methodsFor:'private'!
+
+criticalWarningReasonCodes
+    ^ #(#'packageNameMismatch' #'projectClassNameFileMismatch' #'duplicateVersionDefinitions')
+!
+
+errorReasonCodes
+    ^ #(#'duplicateNames' #'shadowedNames' #'invalidDoItSelector' #'invalidVersionString' #'missingVersionImport' #'projectCreationError' #'noVersionsDefined' #'cannotResolveVersion' #'incompleteProjectSpec' #'incorrectVersionString' #'versionCompositionError' #'versionCreationError')
+!
+
+validateBaselineVersionSpec: versionSpec
+
+	self subclassResponsibility
+!
+
+validateDoIts: aSpec versionString: versionString errorMessage: errorMessage
+	| ar |
+	ar := {
+		#preLoadDoIt.	'preLoadDoIt selector for '.
+		#postLoadDoIt.	'postLoadDoIt selector for '.
+	}.
+	1 to: ar size by: 2 do: [ :i | 
+		| selector |
+		selector := (aSpec perform: (ar at: i)) value.
+		selector ~~ nil
+			ifTrue: [ 
+				selector isSymbol
+					ifFalse: [ 
+						self
+							recordValidationError: (ar at: i + 1) , errorMessage , ' is not a symbol'
+							versionString: versionString
+							callSite: #validateDoIts:versionString:errorMessage:
+							reasonCode: #invalidDoItSelector ] ] ]
+!
+
+validatePragmas
+    "Ensure that versions are Strings and symbolic versions are symbols.
+	 Ensure that imported versions are defined"
+
+    | versionPragmas versionImportPragmas symbolicVersionPragmas versionStrings |
+    versionPragmas := self extractVersionPragmas.
+    versionImportPragmas := self extractVersionImportPragmas.
+    symbolicVersionPragmas := self extractSymbolicVersionPragmas.
+    versionStrings := Set new.
+    versionPragmas keys , versionImportPragmas keys , symbolicVersionPragmas keys
+        do: [ :versionString | 
+            (versionStrings includes: versionString)
+                ifTrue: [ 
+                    self
+                        recordValidationCriticalWarning:
+                            'version ' , versionString printString , ' is defined multiple times.'
+                        versionString: versionString
+                        callSite: #'validatePragmas'
+                        reasonCode: #'duplicateVersionDefinitions' ]
+                ifFalse: [ versionStrings add: versionString ] ].
+    versionPragmas
+        keysAndValuesDo: [ :versionString :pragmaList | 
+            versionString isString
+                ifFalse: [ 
+                    self
+                        recordValidationError: 'version ' , versionString printString , ' is not a String.'
+                        versionString: versionString
+                        callSite: #'validatePragmas'
+                        reasonCode: #'invalidVersionString' ].
+            pragmaList size > 1
+                ifTrue: [ 
+                    self
+                        recordValidationCriticalWarning:
+                            'version ' , versionString printString , ' is defined multiple times.'
+                        versionString: versionString
+                        callSite: #'validatePragmas'
+                        reasonCode: #'duplicateVersionDefinitions' ] ].
+    symbolicVersionPragmas
+        keysAndValuesDo: [ :versionString :pragmaList | 
+            versionString isSymbol
+                ifFalse: [ 
+                    self
+                        recordValidationError: 'symbolic version ' , versionString printString , ' is not a Symbol.'
+                        versionString: versionString
+                        callSite: #'validatePragmas'
+                        reasonCode: #'invalidVersionString' ].
+            pragmaList size > 1
+                ifTrue: [ 
+                    self
+                        recordValidationCriticalWarning:
+                            'version ' , versionString printString , ' is defined multiple times.'
+                        versionString: versionString
+                        callSite: #'validatePragmas'
+                        reasonCode: #'duplicateVersionDefinitions' ] ].
+    versionImportPragmas
+        keysAndValuesDo: [ :versionString :pragmaList | 
+            versionString isString
+                ifFalse: [ 
+                    self
+                        recordValidationError: 'version ' , versionString printString , ' is not a String.'
+                        versionString: versionString
+                        callSite: #'validatePragmas'
+                        reasonCode: #'invalidVersionString' ].
+            pragmaList size > 1
+                ifTrue: [ 
+                    self
+                        recordValidationCriticalWarning:
+                            'version ' , versionString printString , ' is defined multiple times.'
+                        versionString: versionString
+                        callSite: #'validatePragmas'
+                        reasonCode: #'duplicateVersionDefinitions' ].
+            pragmaList
+                do: [ :versionImportPragma | 
+                    (versionImportPragma arguments at: 2)
+                        do: [ :importedVersionString | 
+                            (versionStrings includes: importedVersionString)
+                                ifFalse: [ 
+                                    self
+                                        recordValidationError:
+                                            'version ' , importedVersionString printString , ' referenced in import list of version ' , versionString printString
+                                                , ' has not been defined.'
+                                        versionString: versionString
+                                        callSite: #'validatePragmas'
+                                        reasonCode: #'missingVersionImport' ] ] ] ]
+!
+
+validateProject
+	| project |
+	project := self
+		validateProjectCreationFrom: self configurationClass
+		onError: [ :ex | 
+			self
+				recordValidationError:
+					'Error creating project: ' , ex description , ' to reproduce evalutate the following: '''
+						, self configurationClass name asString , ' project'''
+				callSite: #validateProject
+				reasonCode: #projectCreationError.
+			^ self validationReport ].
+	^ self validateProject: project
+!
+
+validateProjectCreationFrom: aConfigurationClass onError: aBlock
+    [ ^ aConfigurationClass project ]
+        on: Error , MetacelloValidationNotification , MetacelloErrorInProjectConstructionNotification
+        do: [ :ex | 
+            (ex isKindOf: MetacelloValidationNotification)
+                ifTrue: [ 
+                    self validationReport add: ex issue.
+                    ex resume ].
+            (ex isKindOf: MetacelloErrorInProjectConstructionNotification)
+                ifTrue: [ 
+                    self
+                        recordValidationError:
+                            'Error creating version: ' , ex versionString , ' error: ' , ex exception description
+                                , ' to reproduce evalutate the following: ''[' , self configurationClass name asString
+                                ,
+                                    ' project ] on: MetacelloErrorInProjectConstructionNotification do: [:ex | ex resume: true ]'''
+                        callSite: #'validateProjectCreationFrom:onError:'
+                        reasonCode: #'versionCreationError'.
+                    ex resume: false ].
+            ^ aBlock value: ex ]
+!
+
+validateProjectVersion: versionString
+	| project |
+	project := self
+		validateProjectCreationFrom: self configurationClass
+		onError: [ :ex | 
+			self
+				recordValidationError:
+					'Error creating project: ' , ex description , ' to reproduce evalutate the following: '''
+						, self configurationClass name asString , ' project'''
+				callSite: #validateProject
+				reasonCode: #projectCreationError.
+			^ self validationReport ].
+	^ self validateProject: project version: versionString
+!
+
+validateVersionSpec: versionSpec
+
+	self subclassResponsibility
+!
+
+validateVersionSpecForSymbolicVersion: versionSpec symbolicVersion: symbolicVersionString
+
+	self subclassResponsibility
+!
+
+warningReasonCodes
+	^ #(#onlyBaselineVersion )
+! !
+
+!MetacelloVersionValidator methodsFor:'validation'!
+
+validate
+	"Issue 5: 
+		[]no shadowing of names across project/package/group boundaries
+	 Issue 6: 
+		[]package version supplied for each package
+		[]no released (stable/bleedingEdge) versions (only development version)
+		package spec used instead of project spec in baseline (ConfigurationOfPharo-DaleHenrichs.50)
+	Issue 20:
+		[]pre and post load doits must be symbols, not blocks
+	Others:
+		[]symbolic versions can be resolved.
+		[]Ensure that versions are Strings and symbolic versions are symbols.
+	 	[]Ensure that imported versions are defined."
+
+	self validatePragmas.
+	^self validateProject
+!
+
+validateProject: project
+	| hasNoBaseline hasNoVersion |
+	(self visited includes: project configuration class)
+		ifTrue: [ ^ self validationReport ].
+	self visited add: project configuration class.
+	hasNoBaseline := hasNoVersion := true.
+	project versions
+		do: [ :version | 
+			| spec |
+			spec := version spec.
+			[ 
+			spec blessing value == #baseline
+				ifTrue: [ 
+					hasNoBaseline := false.
+					self validateBaselineVersionSpec: spec ]
+				ifFalse: [ 
+					hasNoVersion := false.
+					self validateVersionSpec: spec ] ]
+				on: Error
+				do: [ :ex | 
+					self
+						recordValidationError: 'Error composing version ' , version versionString printString , ': ' , ex description
+						versionString: version versionString
+						callSite: #validateProject:
+						reasonCode: #versionCompositionError ] ].
+	project symbolicVersionMap keys
+		do: [ :symbolicVersion | 
+			| version |
+			version := [ project version: symbolicVersion ]
+				on: Error , MetacelloSymbolicVersionNotDefinedError
+				do: [ :ex | 
+					"MetacelloSymbolicVersionNotDefinedError are explicitly not defined, so are not validation errors"
+					(ex isKindOf: MetacelloSymbolicVersionNotDefinedError)
+						ifFalse: [ 
+							self
+								recordValidationError:
+									'symbolic version ' , symbolicVersion printString , ' does not resolve to a literal version.'
+								callSite: #validatePragmas
+								reasonCode: #cannotResolveVersion ].
+					ex return: nil ].
+			version ~~ nil
+				ifTrue: [ self validateVersionSpecForSymbolicVersion: version spec symbolicVersion: symbolicVersion ] ].
+	hasNoVersion
+		ifTrue: [ 
+			hasNoBaseline
+				ifTrue: [ 
+					self
+						recordValidationError: 'No usable baseline or versions defined.'
+						callSite: #validatePragmas
+						reasonCode: #noVersionsDefined ]
+				ifFalse: [ 
+					self
+						recordValidationWarning: 'Only baseline defined (no version defined).'
+						callSite: #validatePragmas
+						reasonCode: #onlyBaselineVersion ] ].
+	^ self validationReport
+!
+
+validateProject: project version: versionString
+	| version spec |
+	(self visited includes: project configuration class)
+		ifTrue: [ ^ self validationReport ].
+	self visited add: project configuration class.
+	[ version := project version: versionString ]
+		on: Error
+		do: [ :ex | 
+			self
+				recordValidationError: 'Could not resolve version ' , versionString printString , ' due to error: ' , ex description
+				versionString: versionString
+				callSite: #validateProject:version:
+				reasonCode: #cannotResolveVersion.
+			^ self validationReport ].
+	spec := version spec.
+	[ 
+	spec blessing value == #baseline
+		ifTrue: [ self validateBaselineVersionSpec: spec ]
+		ifFalse: [ self validateVersionSpec: spec ] ]
+		on: Error
+		do: [ :ex | 
+			self
+				recordValidationError: 'Error composing version ' , version versionString printString , ': ' , ex description
+				versionString: version versionString
+				callSite: #validateProject:version:
+				reasonCode: #versionCompositionError ].
+	^ self validationReport
+! !
+
+!MetacelloVersionValidator class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/abbrev.stc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,87 @@
+# automagically generated by the project definition
+# this file is needed for stc to be able to compile modules independently.
+# it provides information about a classes filename, category and especially namespace.
+MetacelloMethodSectionPath MetacelloMethodSectionPath stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloMethodSpec MetacelloMethodSpec stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloPackageSpecResolutionError MetacelloPackageSpecResolutionError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloPlatform MetacelloPlatform stx:goodies/metacello/core 'Metacello-Core-Model' 0
+stx_goodies_metacello_core stx_goodies_metacello_core stx:goodies/metacello/core '* Projects & Packages *' 3
+MetacelloSymbolicVersionMethodSpec MetacelloSymbolicVersionMethodSpec stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloVersionMethodSpec MetacelloVersionMethodSpec stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloAbstractConstructor MetacelloAbstractConstructor stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloBaseConfiguration MetacelloBaseConfiguration stx:goodies/metacello/core 'Metacello-Core-Deprecated' 0
+MetacelloCannotUpdateReleasedVersionError MetacelloCannotUpdateReleasedVersionError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloCleanNotification MetacelloCleanNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloClearStackCacheNotification MetacelloClearStackCacheNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloErrorInProjectConstructionNotification MetacelloErrorInProjectConstructionNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloMethodSection MetacelloMethodSection stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloProject MetacelloProject stx:goodies/metacello/core 'Metacello-Core-Model' 0
+MetacelloProjectRegistration MetacelloProjectRegistration stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloProjectRegistry MetacelloProjectRegistry stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloProjectSpecForLoad MetacelloProjectSpecForLoad stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloProjectSpecGenerator MetacelloProjectSpecGenerator stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloProjectSpecLoadError MetacelloProjectSpecLoadError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloScriptEngine MetacelloScriptEngine stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloScriptExecutor MetacelloScriptExecutor stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloScriptGitHubDownloadNotification MetacelloScriptGitHubDownloadNotification stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloScriptNotification MetacelloScriptNotification stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloScriptingError MetacelloScriptingError stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloSemanticVersionNumber MetacelloSemanticVersionNumber stx:goodies/metacello/core 'Metacello-Core-Model' 0
+MetacelloSkipDirtyPackageLoad MetacelloSkipDirtyPackageLoad stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloSpec MetacelloSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloSpecLoader MetacelloSpecLoader stx:goodies/metacello/core 'Metacello-Core-Loaders' 0
+MetacelloStackCacheNotification MetacelloStackCacheNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloValidationFailure MetacelloValidationFailure stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloValidationIssue MetacelloValidationIssue stx:goodies/metacello/core 'Metacello-Core-Validation' 0
+MetacelloValidationNotification MetacelloValidationNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloVersion MetacelloVersion stx:goodies/metacello/core 'Metacello-Core-Model' 0
+MetacelloVersionDoesNotExistError MetacelloVersionDoesNotExistError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloVersionNumber MetacelloVersionNumber stx:goodies/metacello/core 'Metacello-Core-Model' 0
+MetacelloAbstractPackageSpec MetacelloAbstractPackageSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloAbstractVersionConstructor MetacelloAbstractVersionConstructor stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloBaselineSpecGenerator MetacelloBaselineSpecGenerator stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloCleanLoadAndTestsNotification MetacelloCleanLoadAndTestsNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloCleanLoadNotification MetacelloCleanLoadNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloConfigurationSpecGenerator MetacelloConfigurationSpecGenerator stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloConflictingProjectError MetacelloConflictingProjectError stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloLockedProjectError MetacelloLockedProjectError stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloMemberListSpec MetacelloMemberListSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloMemberSpec MetacelloMemberSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloProjectSpec MetacelloProjectSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloProjectSpecLoadConflict MetacelloProjectSpecLoadConflict stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloResolveProjectUpgrade MetacelloResolveProjectUpgrade stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloScriptApiExecutor MetacelloScriptApiExecutor stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloScriptEnsureProjectLoadedForDevelopment MetacelloScriptEnsureProjectLoadedForDevelopment stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloScriptImageExecutor MetacelloScriptImageExecutor stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloScriptProjectSpecNotification MetacelloScriptProjectSpecNotification stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloScriptRegistryExecutor MetacelloScriptRegistryExecutor stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloSymbolicVersionDoesNotExistError MetacelloSymbolicVersionDoesNotExistError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloSymbolicVersionSpec MetacelloSymbolicVersionSpec stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloUseUpgradeError MetacelloUseUpgradeError stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloValidationCriticalWarning MetacelloValidationCriticalWarning stx:goodies/metacello/core 'Metacello-Core-Validation' 0
+MetacelloValidationError MetacelloValidationError stx:goodies/metacello/core 'Metacello-Core-Validation' 0
+MetacelloValidationWarning MetacelloValidationWarning stx:goodies/metacello/core 'Metacello-Core-Validation' 0
+MetacelloValueHolderSpec MetacelloValueHolderSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloVersionDefinitionError MetacelloVersionDefinitionError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloVersionMethodSection MetacelloVersionMethodSection stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloVersionSpec MetacelloVersionSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloVersionValidator MetacelloVersionValidator stx:goodies/metacello/core 'Metacello-Core-Validation' 1
+MetacelloAddMemberSpec MetacelloAddMemberSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloAllowConflictingProjectUpgrade MetacelloAllowConflictingProjectUpgrade stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloAllowProjectDowngrade MetacelloAllowProjectDowngrade stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloAllowProjectUpgrade MetacelloAllowProjectUpgrade stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloBaselineConstructor MetacelloBaselineConstructor stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloCopyMemberSpec MetacelloCopyMemberSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloGenericProjectSpec MetacelloGenericProjectSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloGroupSpec MetacelloGroupSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloLookupBaselineSpecForEnsureLoad MetacelloLookupBaselineSpecForEnsureLoad stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloLookupProjectSpec MetacelloLookupProjectSpec stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloLookupProjectSpecForLoad MetacelloLookupProjectSpecForLoad stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloMergeMemberSpec MetacelloMergeMemberSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloPackagesSpec MetacelloPackagesSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloProjectReferenceSpec MetacelloProjectReferenceSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloProjectSpecLoadedNotification MetacelloProjectSpecLoadedNotification stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloRemoveMemberSpec MetacelloRemoveMemberSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloSymbolicVersionNotDefinedError MetacelloSymbolicVersionNotDefinedError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloToolBoxConstructor MetacelloToolBoxConstructor stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloVersionConstructor MetacelloVersionConstructor stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/bc.mak	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,166 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_core.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# Notice, that the name bc.mak is historical (from times, when only borland c was supported).
+# This file contains make rules for the win32 platform using either borland-bcc or visual-c.
+# It shares common definitions with the unix-make in Make.spec.
+# The bc.mak supports the following targets:
+#    bmake         - compile all st-files to a classLib (dll)
+#    bmake clean   - clean all temp files
+#    bmake clobber - clean all
+#
+# Historic Note:
+#  this used to contain only rules to make with borland
+#    (called via bmake, by "make.exe -f bc.mak")
+#  this has changed; it is now also possible to build using microsoft visual c
+#    (called via vcmake, by "make.exe -f bc.mak -DUSEVC")
+#
+TOP=..\..\..
+INCLUDE_TOP=$(TOP)\..
+
+
+
+!INCLUDE $(TOP)\rules\stdHeader_bc
+
+!INCLUDE Make.spec
+
+LIBNAME=libstx_goodies_metacello_core
+RESFILES=core.$(RES)
+
+
+
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\metacello\base -I$(INCLUDE_TOP)\stx\libbasic
+LOCALDEFINES=
+
+STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
+LOCALLIBS=
+
+OBJS= $(COMMON_OBJS) $(WIN32_OBJS)
+
+ALL::  classLibRule
+
+classLibRule: $(OUTDIR) $(OUTDIR)$(LIBNAME).dll
+
+!INCLUDE $(TOP)\rules\stdRules_bc
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+	pushd ..\..\..\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\base & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+
+
+
+
+
+
+
+test: $(TOP)\goodies\builder\reports\NUL
+	pushd $(TOP)\goodies\builder\reports & $(MAKE_BAT)
+	$(TOP)\goodies\builder\reports\report-runner.bat -D . -r Builder::TestReport -p $(PACKAGE)
+        
+clean::
+	del *.$(CSUFFIX)
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)MetacelloAbstractConstructor.$(O) MetacelloAbstractConstructor.$(H): MetacelloAbstractConstructor.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaseConfiguration.$(O) MetacelloBaseConfiguration.$(H): MetacelloBaseConfiguration.st $(INCLUDE_TOP)\stx\goodies\metacello\base\ConfigurationOf.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCannotUpdateReleasedVersionError.$(O) MetacelloCannotUpdateReleasedVersionError.$(H): MetacelloCannotUpdateReleasedVersionError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanNotification.$(O) MetacelloCleanNotification.$(H): MetacelloCleanNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloClearStackCacheNotification.$(O) MetacelloClearStackCacheNotification.$(H): MetacelloClearStackCacheNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloErrorInProjectConstructionNotification.$(O) MetacelloErrorInProjectConstructionNotification.$(H): MetacelloErrorInProjectConstructionNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSection.$(O) MetacelloMethodSection.$(H): MetacelloMethodSection.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSectionPath.$(O) MetacelloMethodSectionPath.$(H): MetacelloMethodSectionPath.st $(INCLUDE_TOP)\stx\libbasic\Array.$(H) $(INCLUDE_TOP)\stx\libbasic\ArrayedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSpec.$(O) MetacelloMethodSpec.$(H): MetacelloMethodSpec.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPackageSpecResolutionError.$(O) MetacelloPackageSpecResolutionError.$(H): MetacelloPackageSpecResolutionError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPlatform.$(O) MetacelloPlatform.$(H): MetacelloPlatform.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProject.$(O) MetacelloProject.$(H): MetacelloProject.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectRegistration.$(O) MetacelloProjectRegistration.$(H): MetacelloProjectRegistration.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectRegistry.$(O) MetacelloProjectRegistry.$(H): MetacelloProjectRegistry.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecForLoad.$(O) MetacelloProjectSpecForLoad.$(H): MetacelloProjectSpecForLoad.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecGenerator.$(O) MetacelloProjectSpecGenerator.$(H): MetacelloProjectSpecGenerator.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadError.$(O) MetacelloProjectSpecLoadError.$(H): MetacelloProjectSpecLoadError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptEngine.$(O) MetacelloScriptEngine.$(H): MetacelloScriptEngine.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptExecutor.$(O) MetacelloScriptExecutor.$(H): MetacelloScriptExecutor.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptGitHubDownloadNotification.$(O) MetacelloScriptGitHubDownloadNotification.$(H): MetacelloScriptGitHubDownloadNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptNotification.$(O) MetacelloScriptNotification.$(H): MetacelloScriptNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptingError.$(O) MetacelloScriptingError.$(H): MetacelloScriptingError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSemanticVersionNumber.$(O) MetacelloSemanticVersionNumber.$(H): MetacelloSemanticVersionNumber.st $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSkipDirtyPackageLoad.$(O) MetacelloSkipDirtyPackageLoad.$(H): MetacelloSkipDirtyPackageLoad.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSpec.$(O) MetacelloSpec.$(H): MetacelloSpec.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSpecLoader.$(O) MetacelloSpecLoader.$(H): MetacelloSpecLoader.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStackCacheNotification.$(O) MetacelloStackCacheNotification.$(H): MetacelloStackCacheNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationFailure.$(O) MetacelloValidationFailure.$(H): MetacelloValidationFailure.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationIssue.$(O) MetacelloValidationIssue.$(H): MetacelloValidationIssue.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationNotification.$(O) MetacelloValidationNotification.$(H): MetacelloValidationNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersion.$(O) MetacelloVersion.$(H): MetacelloVersion.st $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionDoesNotExistError.$(O) MetacelloVersionDoesNotExistError.$(H): MetacelloVersionDoesNotExistError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionNumber.$(O) MetacelloVersionNumber.$(H): MetacelloVersionNumber.st $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_core.$(O) stx_goodies_metacello_core.$(H): stx_goodies_metacello_core.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAbstractPackageSpec.$(O) MetacelloAbstractPackageSpec.$(H): MetacelloAbstractPackageSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAbstractVersionConstructor.$(O) MetacelloAbstractVersionConstructor.$(H): MetacelloAbstractVersionConstructor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaselineSpecGenerator.$(O) MetacelloBaselineSpecGenerator.$(H): MetacelloBaselineSpecGenerator.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloProjectSpecGenerator.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanLoadAndTestsNotification.$(O) MetacelloCleanLoadAndTestsNotification.$(H): MetacelloCleanLoadAndTestsNotification.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloCleanNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanLoadNotification.$(O) MetacelloCleanLoadNotification.$(H): MetacelloCleanLoadNotification.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloCleanNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloConfigurationSpecGenerator.$(O) MetacelloConfigurationSpecGenerator.$(H): MetacelloConfigurationSpecGenerator.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloProjectSpecGenerator.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloConflictingProjectError.$(O) MetacelloConflictingProjectError.$(H): MetacelloConflictingProjectError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptingError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLockedProjectError.$(O) MetacelloLockedProjectError.$(H): MetacelloLockedProjectError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptingError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMemberListSpec.$(O) MetacelloMemberListSpec.$(H): MetacelloMemberListSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMemberSpec.$(O) MetacelloMemberSpec.$(H): MetacelloMemberSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpec.$(O) MetacelloProjectSpec.$(H): MetacelloProjectSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadConflict.$(O) MetacelloProjectSpecLoadConflict.$(H): MetacelloProjectSpecLoadConflict.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloProjectSpecLoadError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloResolveProjectUpgrade.$(O) MetacelloResolveProjectUpgrade.$(H): MetacelloResolveProjectUpgrade.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptApiExecutor.$(O) MetacelloScriptApiExecutor.$(H): MetacelloScriptApiExecutor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptEnsureProjectLoadedForDevelopment.$(O) MetacelloScriptEnsureProjectLoadedForDevelopment.$(H): MetacelloScriptEnsureProjectLoadedForDevelopment.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptImageExecutor.$(O) MetacelloScriptImageExecutor.$(H): MetacelloScriptImageExecutor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptProjectSpecNotification.$(O) MetacelloScriptProjectSpecNotification.$(H): MetacelloScriptProjectSpecNotification.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptRegistryExecutor.$(O) MetacelloScriptRegistryExecutor.$(H): MetacelloScriptRegistryExecutor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionDoesNotExistError.$(O) MetacelloSymbolicVersionDoesNotExistError.$(H): MetacelloSymbolicVersionDoesNotExistError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionMethodSpec.$(O) MetacelloSymbolicVersionMethodSpec.$(H): MetacelloSymbolicVersionMethodSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMethodSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionSpec.$(O) MetacelloSymbolicVersionSpec.$(H): MetacelloSymbolicVersionSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMethodSection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloUseUpgradeError.$(O) MetacelloUseUpgradeError.$(H): MetacelloUseUpgradeError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptingError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationCriticalWarning.$(O) MetacelloValidationCriticalWarning.$(H): MetacelloValidationCriticalWarning.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloValidationIssue.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationError.$(O) MetacelloValidationError.$(H): MetacelloValidationError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloValidationIssue.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationWarning.$(O) MetacelloValidationWarning.$(H): MetacelloValidationWarning.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloValidationIssue.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValueHolderSpec.$(O) MetacelloValueHolderSpec.$(H): MetacelloValueHolderSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionDefinitionError.$(O) MetacelloVersionDefinitionError.$(H): MetacelloVersionDefinitionError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionMethodSection.$(O) MetacelloVersionMethodSection.$(H): MetacelloVersionMethodSection.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMethodSection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionMethodSpec.$(O) MetacelloVersionMethodSpec.$(H): MetacelloVersionMethodSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMethodSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionSpec.$(O) MetacelloVersionSpec.$(H): MetacelloVersionSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionValidator.$(O) MetacelloVersionValidator.$(H): MetacelloVersionValidator.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAddMemberSpec.$(O) MetacelloAddMemberSpec.$(H): MetacelloAddMemberSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowConflictingProjectUpgrade.$(O) MetacelloAllowConflictingProjectUpgrade.$(H): MetacelloAllowConflictingProjectUpgrade.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowProjectDowngrade.$(O) MetacelloAllowProjectDowngrade.$(H): MetacelloAllowProjectDowngrade.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowProjectUpgrade.$(O) MetacelloAllowProjectUpgrade.$(H): MetacelloAllowProjectUpgrade.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaselineConstructor.$(O) MetacelloBaselineConstructor.$(H): MetacelloBaselineConstructor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCopyMemberSpec.$(O) MetacelloCopyMemberSpec.$(H): MetacelloCopyMemberSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloGenericProjectSpec.$(O) MetacelloGenericProjectSpec.$(H): MetacelloGenericProjectSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloProjectSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloGroupSpec.$(O) MetacelloGroupSpec.$(H): MetacelloGroupSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupBaselineSpecForEnsureLoad.$(O) MetacelloLookupBaselineSpecForEnsureLoad.$(H): MetacelloLookupBaselineSpecForEnsureLoad.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupProjectSpec.$(O) MetacelloLookupProjectSpec.$(H): MetacelloLookupProjectSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupProjectSpecForLoad.$(O) MetacelloLookupProjectSpecForLoad.$(H): MetacelloLookupProjectSpecForLoad.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMergeMemberSpec.$(O) MetacelloMergeMemberSpec.$(H): MetacelloMergeMemberSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPackagesSpec.$(O) MetacelloPackagesSpec.$(H): MetacelloPackagesSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberListSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectReferenceSpec.$(O) MetacelloProjectReferenceSpec.$(H): MetacelloProjectReferenceSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadedNotification.$(O) MetacelloProjectSpecLoadedNotification.$(H): MetacelloProjectSpecLoadedNotification.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloRemoveMemberSpec.$(O) MetacelloRemoveMemberSpec.$(H): MetacelloRemoveMemberSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionNotDefinedError.$(O) MetacelloSymbolicVersionNotDefinedError.$(H): MetacelloSymbolicVersionNotDefinedError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSymbolicVersionDoesNotExistError.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloToolBoxConstructor.$(O) MetacelloToolBoxConstructor.$(H): MetacelloToolBoxConstructor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionConstructor.$(O) MetacelloVersionConstructor.$(H): MetacelloVersionConstructor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)\stx\libbasic\AbstractTime.$(H) $(INCLUDE_TOP)\stx\libbasic\ArithmeticValue.$(H) $(INCLUDE_TOP)\stx\libbasic\ArrayedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\Block.$(H) $(INCLUDE_TOP)\stx\libbasic\CharacterArray.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\CompiledCode.$(H) $(INCLUDE_TOP)\stx\libbasic\ExecutableFunction.$(H) $(INCLUDE_TOP)\stx\libbasic\Integer.$(H) $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Number.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\String.$(H) $(INCLUDE_TOP)\stx\libbasic\Symbol.$(H) $(INCLUDE_TOP)\stx\libbasic\Timestamp.$(H) $(INCLUDE_TOP)\stx\libbasic\UndefinedObject.$(H) $(INCLUDE_TOP)\stx\libbasic\UninterpretedBytes.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
+# **Must be at end**
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+!IFDEF HGROOT
+$(OUTDIR)stx_goodies_metacello_core.$(O): $(HGROOT)\.hg\dirstate
+!ENDIF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/bmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,12 @@
+@REM -------
+@REM make using Borland bcc32
+@REM type bmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak  %DEFINES% %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/core.rc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+//
+// DO NOT EDIT
+// automagically generated from the projectDefinition: stx_goodies_metacello_core.
+//
+VS_VERSION_INFO VERSIONINFO
+  FILEVERSION     6,2,32767,32767
+  PRODUCTVERSION  6,2,4,0
+#if (__BORLANDC__)
+  FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
+  FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
+  FILEOS          VOS_NT_WINDOWS32
+  FILETYPE        VFT_DLL
+  FILESUBTYPE     VS_USER_DEFINED
+#endif
+
+BEGIN
+  BLOCK "StringFileInfo"
+  BEGIN
+    BLOCK "040904E4"
+    BEGIN
+      VALUE "CompanyName", "Dale Henrichs & Jan Vrany\0"
+      VALUE "FileDescription", "Metacello -- a Smalltalk project configuration management tool (LIB)\0"
+      VALUE "FileVersion", "6.2.32767.32767\0"
+      VALUE "InternalName", "stx:goodies/metacello/core\0"
+      VALUE "LegalCopyright", "Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)\0"
+      VALUE "ProductName", "Metacello\0"
+      VALUE "ProductVersion", "6.2.4.0\0"
+      VALUE "ProductDate", "Thu, 21 Aug 2014 08:17:45 GMT\0"
+    END
+
+  END
+
+  BLOCK "VarFileInfo"
+  BEGIN                               //  Language   |    Translation
+    VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
+  END
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/extensions.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,588 @@
+"{ Package: 'stx:goodies/metacello/core' }"!
+
+!Block methodsFor:'*metacello-core-scripting'!
+
+execute: projectSpecBlock against: aScriptExecutor
+    aScriptExecutor executeBlock: self do: projectSpecBlock
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setAuthorInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setAuthorWithBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setBaseline: aString withInMetacelloConfig: aMetacelloConfig
+    aMetacelloConfig setBaseline: aString withBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setBlessingInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setBlessingWithBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setConfiguration: aString withInMetacelloConfig: aMetacelloConfig
+    aMetacelloConfig setConfiguration: aString withBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setDescriptionInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setDescriptionWithBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setPackage: aString withInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setPackage: aString withBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setProject: aString withInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setProject: aString withBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setTimestampInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setTimestampWithBlock: self
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+addToMetacelloPackages: aMetacelloPackagesSpec
+
+	self do: [:each | each addToMetacelloPackages: aMetacelloPackagesSpec ]
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+asMetacelloAttributeList
+    ^ self
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+asMetacelloAttributePath
+    ^ MetacelloMethodSectionPath withAll: self
+! !
+
+!Collection methodsFor:'*metacello-core-scripting'!
+
+execute: projectSpecBlock against: aScriptExecutor
+    aScriptExecutor executeCollection: self do: projectSpecBlock
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+mergeIntoMetacelloPackages: aMetacelloPackagesSpec
+
+	self do: [:each | each mergeIntoMetacelloPackages: aMetacelloPackagesSpec ]
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+removeFromMetacelloPackages: aMetacelloPackagesSpec
+
+	self do: [:each | each removeFromMetacelloPackages: aMetacelloPackagesSpec ]
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+setForDo: aBlock withInMetacelloConfig: aMetacelloConstructore
+    aMetacelloConstructore setFor: self do: aBlock
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+setForVersion: aString withInMetacelloConfig: aMetacelloConstructore
+    aMetacelloConstructore setFor: self version: aString
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+setIncludesInMetacelloPackage: aMetacelloPackageSpec
+
+	aMetacelloPackageSpec setIncludes: self asArray.
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+setLoadsInMetacelloProject: aMetacelloPackageSpec
+
+	aMetacelloPackageSpec setLoads: self asArray.
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+setRequiresInMetacelloPackage: aMetacelloPackageSpec
+
+	aMetacelloPackageSpec setRequires: self asArray.
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloIntegerLessThanSelf: anInteger
+
+	^anInteger < self
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloSemanticIntegerLessThanSelf: anInteger
+    ^ anInteger < self
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloSemanticStringLessThanSelf: aString
+    "string version components are always '<' integer component"
+
+    ^ true
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloSemanticVersionComponentLessThan: aMetacelloVersonComponent
+    ^ aMetacelloVersonComponent metacelloSemanticIntegerLessThanSelf: self
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloStringLessThanSelf: aString
+	"string version components are always '<' integer component"
+	
+	^true
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloVersionComponentLessThan: aMetacelloVersonComponent
+
+	^aMetacelloVersonComponent metacelloIntegerLessThanSelf: self
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloIntegerLessThanSelf: anInteger
+
+	^self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloSemanticIntegerLessThanSelf: anInteger
+    ^ self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloSemanticStringLessThanSelf: anInteger
+    ^ self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloSemanticVersionComponentLessThan: aMetacelloVersonComponent
+    ^ self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloStringLessThanSelf: anInteger
+
+	^self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloVersionComponentLessThan: aMetacelloVersonComponent
+
+	^self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+addToMetacelloPackages: aMetacelloPackagesSpec
+
+	| spec |
+	spec := 
+		(aMetacelloPackagesSpec project packageSpec)
+			file: self;
+			yourself.
+	aMetacelloPackagesSpec addMember: 
+		(aMetacelloPackagesSpec addMember 
+			name: spec name;
+			spec: spec;
+			yourself)
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+asMetacelloSemanticVersionNumber
+    ^ MetacelloSemanticVersionNumber fromString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+asMetacelloVersionNumber
+
+	^MetacelloVersionNumber fromString: self
+! !
+
+!String methodsFor:'*metacello-core-scripting'!
+
+execute: projectSpecBlock against: aScriptExecutor
+    aScriptExecutor executeString: self do: projectSpecBlock
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+mergeIntoMetacelloPackages: aMetacelloPackagesSpec
+
+	| spec |
+	spec := 
+		(aMetacelloPackagesSpec project packageSpec)
+			file: self;
+			yourself.
+	aMetacelloPackagesSpec addMember: 
+		(aMetacelloPackagesSpec mergeMember 
+			name: spec name;
+			spec: spec;
+			yourself)
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloIntegerLessThanSelf: anInteger
+	"integer version components are always '>' string component"
+
+	^false
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloSemanticIntegerLessThanSelf: anInteger
+    "integer version components are always '>' string component"
+
+    ^ true
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloSemanticStringLessThanSelf: aString
+    ^ aString < self
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloSemanticVersionComponentLessThan: aMetacelloVersonComponent
+    ^ aMetacelloVersonComponent metacelloSemanticStringLessThanSelf: self
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloStringLessThanSelf: aString
+
+	^aString < self
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloVersionComponentLessThan: aMetacelloVersonComponent
+
+	^aMetacelloVersonComponent metacelloStringLessThanSelf: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+removeFromMetacelloPackages: aMetacelloPackagesSpec
+
+	aMetacelloPackagesSpec addMember: 
+		(aMetacelloPackagesSpec removeMember 
+			name: self;
+			yourself)
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setAuthorInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setAuthorWithString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setAuthorInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setAuthor: 
+		(aMetacelloVersionSpec project valueHolderSpec
+			value: self;
+			yourself)
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setBlessingInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setBlessingWithString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setBlessingInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setBlessing: 
+		(aMetacelloVersionSpec project valueHolderSpec
+			value: self;
+			yourself)
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setDescriptionInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setDescriptionWithString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setDescriptionInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setDescription: 
+		(aMetacelloVersionSpec project valueHolderSpec
+			value: self;
+			yourself)
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setIncludesInMetacelloPackage: aMetacelloPackageSpec
+
+	aMetacelloPackageSpec setIncludes: { self }.
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setLoadsInMetacelloProject: aMetacelloPackageSpec
+
+	aMetacelloPackageSpec setLoads: { self }.
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setPackage: aString withInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setPackage: aString withString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setPostLoadDoItInMetacelloSpec: aMetacelloSpec
+    self asSymbol setPostLoadDoItInMetacelloSpec: aMetacelloSpec
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setPreLoadDoItInMetacelloSpec: aMetacelloSpec
+    self asSymbol setPreLoadDoItInMetacelloSpec: aMetacelloSpec
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setProject: aString withInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setProject: aString withString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setRequiresInMetacelloPackage: aMetacelloPackageSpec
+
+	aMetacelloPackageSpec setRequires: { self }.
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setTimestampInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setTimestampWithString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setTimestampInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setTimestamp: 
+		(aMetacelloVersionSpec project valueHolderSpec
+			value: self;
+			yourself)
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+asMetacelloAttributeList
+    ^ {self}
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+asMetacelloAttributePath
+    ^ MetacelloMethodSectionPath with: {self}
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+setForDo: aBlock withInMetacelloConfig: aMetacelloConstructore
+    aMetacelloConstructore setFor: {self} do: aBlock
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+setForVersion: aString withInMetacelloConfig: aMetacelloConstructore
+    aMetacelloConstructore setFor: {self} version: aString
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+setPostLoadDoItInMetacelloSpec: aMetacelloSpec
+        self isUnary ifFalse:[
+            self error:'Invalid symbol'
+        ].
+
+        aMetacelloSpec setPostLoadDoIt: 
+                (aMetacelloSpec project valueHolderSpec
+                        value: self;
+                        yourself)
+
+    "Modified: / 18-09-2012 / 19:18:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+setPreLoadDoItInMetacelloSpec: aMetacelloSpec
+        self isUnary ifFalse:[
+            self error:'Invalid symbol'
+        ].
+        aMetacelloSpec setPreLoadDoIt: 
+                (aMetacelloSpec project valueHolderSpec
+                        value: self;
+                        yourself)
+
+    "Modified: / 18-09-2012 / 19:19:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Timestamp methodsFor:'*metacello-core'!
+
+setTimestampInMetacelloConfig: aMetacelloConfig
+    aMetacelloConfig setTimestampWithString: self printString
+! !
+
+!Timestamp methodsFor:'*metacello-core'!
+
+setTimestampInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setTimestamp: 
+		(aMetacelloVersionSpec project valueHolderSpec
+			value: self printString;
+			yourself)
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+asMetacelloSemanticVersionNumber
+    ^ MetacelloSemanticVersionNumber fromString: ''
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+asMetacelloVersionNumber
+
+	^MetacelloVersionNumber fromString: ''
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+metacelloRegistrationHash
+    ^ self hash
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+registrationsCompareEqual: aMetacelloProjectSpec
+    ^ self = aMetacelloProjectSpec
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setAuthorInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setAuthor: self
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setBlessingInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setBlessing: self
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setDescriptionInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setDescription: self
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setPostLoadDoItInMetacelloSpec: aMetacelloSpec
+
+	aMetacelloSpec setPostLoadDoIt: 
+		(aMetacelloSpec project valueHolderSpec
+			value: self;
+			yourself)
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setPreLoadDoItInMetacelloSpec: aMetacelloSpec
+
+	aMetacelloSpec setPreLoadDoIt: 
+		(aMetacelloSpec project valueHolderSpec
+			value: self;
+			yourself)
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setProject: aString withInMetacelloConfig: aMetacelloConfig
+
+	aMetacelloConfig setProject: aString withString: self
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setTimestampInMetacelloVersion: aMetacelloVersionSpec
+
+	aMetacelloVersionSpec setTimestamp: self
+! !
+
+!stx_goodies_metacello_core class methodsFor:'documentation'!
+
+extensionsVersion_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/lccmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,8 @@
+@REM -------
+@REM make using lcc compiler
+@REM type lccmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+make.exe -N -f bc.mak -DUSELCC=1 %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/libInit.cc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,117 @@
+/*
+ * $Header$
+ *
+ * DO NOT EDIT
+ * automagically generated from the projectDefinition: stx_goodies_metacello_core.
+ */
+#define __INDIRECTVMINITCALLS__
+#include <stc.h>
+
+#ifdef WIN32
+# pragma codeseg INITCODE "INITCODE"
+#endif
+
+#if defined(INIT_TEXT_SECTION) || defined(DLL_EXPORT)
+DLL_EXPORT void _libstx_goodies_metacello_core_Init() INIT_TEXT_SECTION;
+DLL_EXPORT void _libstx_goodies_metacello_core_InitDefinition() INIT_TEXT_SECTION;
+#endif
+
+void _libstx_goodies_metacello_core_InitDefinition(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_core__DFN", _libstx_goodies_metacello_core_InitDefinition, "stx:goodies/metacello/core");
+_stx_137goodies_137metacello_137core_Init(pass,__pRT__,snd);
+
+__END_PACKAGE__();
+}
+
+void _libstx_goodies_metacello_core_Init(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_core", _libstx_goodies_metacello_core_Init, "stx:goodies/metacello/core");
+_MetacelloAbstractConstructor_Init(pass,__pRT__,snd);
+_MetacelloBaseConfiguration_Init(pass,__pRT__,snd);
+_MetacelloCannotUpdateReleasedVersionError_Init(pass,__pRT__,snd);
+_MetacelloCleanNotification_Init(pass,__pRT__,snd);
+_MetacelloClearStackCacheNotification_Init(pass,__pRT__,snd);
+_MetacelloErrorInProjectConstructionNotification_Init(pass,__pRT__,snd);
+_MetacelloMethodSection_Init(pass,__pRT__,snd);
+_MetacelloMethodSectionPath_Init(pass,__pRT__,snd);
+_MetacelloMethodSpec_Init(pass,__pRT__,snd);
+_MetacelloPackageSpecResolutionError_Init(pass,__pRT__,snd);
+_MetacelloPlatform_Init(pass,__pRT__,snd);
+_MetacelloProject_Init(pass,__pRT__,snd);
+_MetacelloProjectRegistration_Init(pass,__pRT__,snd);
+_MetacelloProjectRegistry_Init(pass,__pRT__,snd);
+_MetacelloProjectSpecForLoad_Init(pass,__pRT__,snd);
+_MetacelloProjectSpecGenerator_Init(pass,__pRT__,snd);
+_MetacelloProjectSpecLoadError_Init(pass,__pRT__,snd);
+_MetacelloScriptEngine_Init(pass,__pRT__,snd);
+_MetacelloScriptExecutor_Init(pass,__pRT__,snd);
+_MetacelloScriptGitHubDownloadNotification_Init(pass,__pRT__,snd);
+_MetacelloScriptNotification_Init(pass,__pRT__,snd);
+_MetacelloScriptingError_Init(pass,__pRT__,snd);
+_MetacelloSemanticVersionNumber_Init(pass,__pRT__,snd);
+_MetacelloSkipDirtyPackageLoad_Init(pass,__pRT__,snd);
+_MetacelloSpec_Init(pass,__pRT__,snd);
+_MetacelloSpecLoader_Init(pass,__pRT__,snd);
+_MetacelloStackCacheNotification_Init(pass,__pRT__,snd);
+_MetacelloValidationFailure_Init(pass,__pRT__,snd);
+_MetacelloValidationIssue_Init(pass,__pRT__,snd);
+_MetacelloValidationNotification_Init(pass,__pRT__,snd);
+_MetacelloVersion_Init(pass,__pRT__,snd);
+_MetacelloVersionDoesNotExistError_Init(pass,__pRT__,snd);
+_MetacelloVersionNumber_Init(pass,__pRT__,snd);
+_stx_137goodies_137metacello_137core_Init(pass,__pRT__,snd);
+_MetacelloAbstractPackageSpec_Init(pass,__pRT__,snd);
+_MetacelloAbstractVersionConstructor_Init(pass,__pRT__,snd);
+_MetacelloBaselineSpecGenerator_Init(pass,__pRT__,snd);
+_MetacelloCleanLoadAndTestsNotification_Init(pass,__pRT__,snd);
+_MetacelloCleanLoadNotification_Init(pass,__pRT__,snd);
+_MetacelloConfigurationSpecGenerator_Init(pass,__pRT__,snd);
+_MetacelloConflictingProjectError_Init(pass,__pRT__,snd);
+_MetacelloLockedProjectError_Init(pass,__pRT__,snd);
+_MetacelloMemberListSpec_Init(pass,__pRT__,snd);
+_MetacelloMemberSpec_Init(pass,__pRT__,snd);
+_MetacelloProjectSpec_Init(pass,__pRT__,snd);
+_MetacelloProjectSpecLoadConflict_Init(pass,__pRT__,snd);
+_MetacelloResolveProjectUpgrade_Init(pass,__pRT__,snd);
+_MetacelloScriptApiExecutor_Init(pass,__pRT__,snd);
+_MetacelloScriptEnsureProjectLoadedForDevelopment_Init(pass,__pRT__,snd);
+_MetacelloScriptImageExecutor_Init(pass,__pRT__,snd);
+_MetacelloScriptProjectSpecNotification_Init(pass,__pRT__,snd);
+_MetacelloScriptRegistryExecutor_Init(pass,__pRT__,snd);
+_MetacelloSymbolicVersionDoesNotExistError_Init(pass,__pRT__,snd);
+_MetacelloSymbolicVersionMethodSpec_Init(pass,__pRT__,snd);
+_MetacelloSymbolicVersionSpec_Init(pass,__pRT__,snd);
+_MetacelloUseUpgradeError_Init(pass,__pRT__,snd);
+_MetacelloValidationCriticalWarning_Init(pass,__pRT__,snd);
+_MetacelloValidationError_Init(pass,__pRT__,snd);
+_MetacelloValidationWarning_Init(pass,__pRT__,snd);
+_MetacelloValueHolderSpec_Init(pass,__pRT__,snd);
+_MetacelloVersionDefinitionError_Init(pass,__pRT__,snd);
+_MetacelloVersionMethodSection_Init(pass,__pRT__,snd);
+_MetacelloVersionMethodSpec_Init(pass,__pRT__,snd);
+_MetacelloVersionSpec_Init(pass,__pRT__,snd);
+_MetacelloVersionValidator_Init(pass,__pRT__,snd);
+_MetacelloAddMemberSpec_Init(pass,__pRT__,snd);
+_MetacelloAllowConflictingProjectUpgrade_Init(pass,__pRT__,snd);
+_MetacelloAllowProjectDowngrade_Init(pass,__pRT__,snd);
+_MetacelloAllowProjectUpgrade_Init(pass,__pRT__,snd);
+_MetacelloBaselineConstructor_Init(pass,__pRT__,snd);
+_MetacelloCopyMemberSpec_Init(pass,__pRT__,snd);
+_MetacelloGenericProjectSpec_Init(pass,__pRT__,snd);
+_MetacelloGroupSpec_Init(pass,__pRT__,snd);
+_MetacelloLookupBaselineSpecForEnsureLoad_Init(pass,__pRT__,snd);
+_MetacelloLookupProjectSpec_Init(pass,__pRT__,snd);
+_MetacelloLookupProjectSpecForLoad_Init(pass,__pRT__,snd);
+_MetacelloMergeMemberSpec_Init(pass,__pRT__,snd);
+_MetacelloPackagesSpec_Init(pass,__pRT__,snd);
+_MetacelloProjectReferenceSpec_Init(pass,__pRT__,snd);
+_MetacelloProjectSpecLoadedNotification_Init(pass,__pRT__,snd);
+_MetacelloRemoveMemberSpec_Init(pass,__pRT__,snd);
+_MetacelloSymbolicVersionNotDefinedError_Init(pass,__pRT__,snd);
+_MetacelloToolBoxConstructor_Init(pass,__pRT__,snd);
+_MetacelloVersionConstructor_Init(pass,__pRT__,snd);
+
+_stx_137goodies_137metacello_137core_extensions_Init(pass,__pRT__,snd);
+__END_PACKAGE__();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/mingwmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+@REM -------
+@REM make using mingw gnu compiler
+@REM type mingwmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+
+@pushd ..\..\..\rules
+@call find_mingw.bat
+@popd
+make.exe -N -f bc.mak %DEFINES% %USEMINGW_ARG% %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/stx_goodies_metacello_core.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,298 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+LibraryDefinition subclass:#stx_goodies_metacello_core
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'* Projects & Packages *'
+!
+
+
+!stx_goodies_metacello_core class methodsFor:'description'!
+
+excludedFromPreRequisites
+    "list all packages which should be ignored in the automatic
+     preRequisites scan. See #preRequisites for more."
+
+    ^ #(
+            #'stx:goodies/monticello'    "MCHttpRepository - referenced by MetacelloPlatform>>createRepository: "
+
+    )
+
+    "Modified: / 03-10-2012 / 12:53:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+preRequisites
+    "list all required packages.
+     This list can be maintained manually or (better) generated and
+     updated by scanning the superclass hierarchies and looking for
+     global variable accesses. (the browser has a menu function for that)
+     Howevery, often too much is found, and you may want to explicitely
+     exclude individual packages in the #excludedFromPrerequisites method."
+
+    ^ #(
+        #'stx:goodies/metacello/base'    "ConfigurationOf - superclass of MetacelloBaseConfiguration "
+        #'stx:libbasic'    "ByteArray - superclass of extended Symbol "
+    )
+! !
+
+!stx_goodies_metacello_core class methodsFor:'description - contents'!
+
+classNamesAndAttributes
+    "lists the classes which are to be included in the project.
+     Each entry in the list may be: a single class-name (symbol),
+     or an array-literal consisting of class name and attributes.
+     Attributes are: #autoload or #<os> where os is one of win32, unix,..."
+
+    ^ #(
+        "<className> or (<className> attributes...) in load order"
+        MetacelloMethodSectionPath
+        MetacelloMethodSpec
+        MetacelloPackageSpecResolutionError
+        MetacelloPlatform
+        #'stx_goodies_metacello_core'
+        MetacelloSymbolicVersionMethodSpec
+        MetacelloVersionMethodSpec
+        MetacelloAbstractConstructor
+        MetacelloBaseConfiguration
+        MetacelloCannotUpdateReleasedVersionError
+        MetacelloCleanNotification
+        MetacelloClearStackCacheNotification
+        MetacelloErrorInProjectConstructionNotification
+        MetacelloMethodSection
+        MetacelloProject
+        MetacelloProjectRegistration
+        MetacelloProjectRegistry
+        MetacelloProjectSpecForLoad
+        MetacelloProjectSpecGenerator
+        MetacelloProjectSpecLoadError
+        MetacelloScriptEngine
+        MetacelloScriptExecutor
+        MetacelloScriptGitHubDownloadNotification
+        MetacelloScriptNotification
+        MetacelloScriptingError
+        MetacelloSemanticVersionNumber
+        MetacelloSkipDirtyPackageLoad
+        MetacelloSpec
+        MetacelloSpecLoader
+        MetacelloStackCacheNotification
+        MetacelloValidationFailure
+        MetacelloValidationIssue
+        MetacelloValidationNotification
+        MetacelloVersion
+        MetacelloVersionDoesNotExistError
+        MetacelloVersionNumber
+        MetacelloAbstractPackageSpec
+        MetacelloAbstractVersionConstructor
+        MetacelloBaselineSpecGenerator
+        MetacelloCleanLoadAndTestsNotification
+        MetacelloCleanLoadNotification
+        MetacelloConfigurationSpecGenerator
+        MetacelloConflictingProjectError
+        MetacelloLockedProjectError
+        MetacelloMemberListSpec
+        MetacelloMemberSpec
+        MetacelloProjectSpec
+        MetacelloProjectSpecLoadConflict
+        MetacelloResolveProjectUpgrade
+        MetacelloScriptApiExecutor
+        MetacelloScriptEnsureProjectLoadedForDevelopment
+        MetacelloScriptImageExecutor
+        MetacelloScriptProjectSpecNotification
+        MetacelloScriptRegistryExecutor
+        MetacelloSymbolicVersionDoesNotExistError
+        MetacelloSymbolicVersionSpec
+        MetacelloUseUpgradeError
+        MetacelloValidationCriticalWarning
+        MetacelloValidationError
+        MetacelloValidationWarning
+        MetacelloValueHolderSpec
+        MetacelloVersionDefinitionError
+        MetacelloVersionMethodSection
+        MetacelloVersionSpec
+        MetacelloVersionValidator
+        MetacelloAddMemberSpec
+        MetacelloAllowConflictingProjectUpgrade
+        MetacelloAllowProjectDowngrade
+        MetacelloAllowProjectUpgrade
+        MetacelloBaselineConstructor
+        MetacelloCopyMemberSpec
+        MetacelloGenericProjectSpec
+        MetacelloGroupSpec
+        MetacelloLookupBaselineSpecForEnsureLoad
+        MetacelloLookupProjectSpec
+        MetacelloLookupProjectSpecForLoad
+        MetacelloMergeMemberSpec
+        MetacelloPackagesSpec
+        MetacelloProjectReferenceSpec
+        MetacelloProjectSpecLoadedNotification
+        MetacelloRemoveMemberSpec
+        MetacelloSymbolicVersionNotDefinedError
+        MetacelloToolBoxConstructor
+        MetacelloVersionConstructor
+    )
+!
+
+extensionMethodNames
+    "lists the extension methods which are to be included in the project.
+     Entries are 2-element array literals, consisting of class-name and selector."
+
+    ^ #(
+        Block setAuthorInMetacelloConfig:
+        Block setBlessingInMetacelloConfig:
+        Block setDescriptionInMetacelloConfig:
+        Block setPackage:withInMetacelloConfig:
+        Block setProject:withInMetacelloConfig:
+        Block setTimestampInMetacelloConfig:
+        Collection addToMetacelloPackages:
+        Collection asMetacelloAttributeList
+        Collection asMetacelloAttributePath
+        Collection mergeIntoMetacelloPackages:
+        Collection removeFromMetacelloPackages:
+        Collection setForDo:withInMetacelloConfig:
+        Collection setForVersion:withInMetacelloConfig:
+        Collection setIncludesInMetacelloPackage:
+        Collection setLoadsInMetacelloProject:
+        Collection setRequiresInMetacelloPackage:
+        Integer metacelloIntegerLessThanSelf:
+        Integer metacelloStringLessThanSelf:
+        Integer metacelloVersionComponentLessThan:
+        Object metacelloIntegerLessThanSelf:
+        Object metacelloStringLessThanSelf:
+        Object metacelloVersionComponentLessThan:
+        String addToMetacelloPackages:
+        String asMetacelloVersionNumber
+        String mergeIntoMetacelloPackages:
+        String metacelloIntegerLessThanSelf:
+        String metacelloStringLessThanSelf:
+        String metacelloVersionComponentLessThan:
+        String removeFromMetacelloPackages:
+        String setAuthorInMetacelloConfig:
+        String setAuthorInMetacelloVersion:
+        String setBlessingInMetacelloConfig:
+        String setBlessingInMetacelloVersion:
+        String setDescriptionInMetacelloConfig:
+        String setDescriptionInMetacelloVersion:
+        String setIncludesInMetacelloPackage:
+        String setLoadsInMetacelloProject:
+        String setPackage:withInMetacelloConfig:
+        String setProject:withInMetacelloConfig:
+        String setRequiresInMetacelloPackage:
+        String setTimestampInMetacelloConfig:
+        String setTimestampInMetacelloVersion:
+        Symbol asMetacelloAttributeList
+        Symbol asMetacelloAttributePath
+        Symbol setForDo:withInMetacelloConfig:
+        Symbol setForVersion:withInMetacelloConfig:
+        Symbol setPostLoadDoItInMetacelloSpec:
+        Symbol setPreLoadDoItInMetacelloSpec:
+        Timestamp setTimestampInMetacelloVersion:
+        UndefinedObject asMetacelloVersionNumber
+        UndefinedObject setAuthorInMetacelloVersion:
+        UndefinedObject setBlessingInMetacelloVersion:
+        UndefinedObject setDescriptionInMetacelloVersion:
+        UndefinedObject setPostLoadDoItInMetacelloSpec:
+        UndefinedObject setPreLoadDoItInMetacelloSpec:
+        UndefinedObject setProject:withInMetacelloConfig:
+        UndefinedObject setTimestampInMetacelloVersion:
+        Block execute:against:
+        Block setBaseline:withInMetacelloConfig:
+        Block setConfiguration:withInMetacelloConfig:
+        Collection execute:against:
+        Integer metacelloSemanticIntegerLessThanSelf:
+        Integer metacelloSemanticStringLessThanSelf:
+        Integer metacelloSemanticVersionComponentLessThan:
+        Object metacelloSemanticIntegerLessThanSelf:
+        Object metacelloSemanticStringLessThanSelf:
+        Object metacelloSemanticVersionComponentLessThan:
+        String asMetacelloSemanticVersionNumber
+        String execute:against:
+        String metacelloSemanticIntegerLessThanSelf:
+        String metacelloSemanticStringLessThanSelf:
+        String metacelloSemanticVersionComponentLessThan:
+        String setPostLoadDoItInMetacelloSpec:
+        String setPreLoadDoItInMetacelloSpec:
+        Timestamp setTimestampInMetacelloConfig:
+        UndefinedObject asMetacelloSemanticVersionNumber
+        UndefinedObject metacelloRegistrationHash
+        UndefinedObject registrationsCompareEqual:
+    )
+! !
+
+!stx_goodies_metacello_core class methodsFor:'description - project information'!
+
+applicationIconFileName
+    "Return the name (without suffix) of an icon-file (the app's icon); will be included in the rc-resource file"
+
+    ^ nil
+    "/ ^ self applicationName
+!
+
+companyName
+    "Return a companyname which will appear in <lib>.rc"
+
+    ^ 'Dale Henrichs & Jan Vrany'
+
+    "Modified: / 10-09-2012 / 22:14:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+description
+    "Return a description string which will appear in vc.def / bc.def"
+
+    ^ 'Metacello -- a Smalltalk project configuration management tool'
+
+    "Modified: / 10-09-2012 / 22:15:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+legalCopyright
+    "Return a copyright string which will appear in <lib>.rc"
+
+    ^ 'Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)'
+
+    "Modified: / 10-09-2012 / 22:16:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+productInstallDirBaseName
+    "Returns a default installDir which will appear in <app>.nsi.
+     This is usually not the one you want to keep"
+
+    ^ (self package asCollectionOfSubstringsSeparatedByAny:':/') last
+!
+
+productName
+    "Return a product name which will appear in <lib>.rc"
+
+    ^ 'Metacello'
+
+    "Modified: / 10-09-2012 / 22:16:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello_core class methodsFor:'description - svn'!
+
+svnRepositoryUrlString
+    "Return a SVN repository URL of myself.
+     (Generated since 2011-04-08)
+     Do not make the string shorter!!!!!! We have to use fixed-length keyword!!!!!!
+    "        
+
+    ^ '$URL::                                                                                                                        $'
+!
+
+svnRevisionNr
+    "Return a SVN revision number of myself.
+     This number is updated after a commit"
+
+    ^ "$SVN-Revision:"'21              '"$"
+! !
+
+!stx_goodies_metacello_core class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/vcmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,20 @@
+@REM -------
+@REM make using Microsoft Visual C compiler
+@REM type vcmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+
+@if not defined VSINSTALLDIR (
+    pushd ..\..\..\rules
+    call vcsetup.bat
+    popd
+)
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak -DUSEVC=1 %DEFINES% %*
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/lccmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,8 @@
+@REM -------
+@REM make using lcc compiler
+@REM type lccmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+make.exe -N -f bc.mak -DUSELCC=1 %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/libInit.cc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,34 @@
+/*
+ * $Header$
+ *
+ * DO NOT EDIT
+ * automagically generated from the projectDefinition: stx_goodies_metacello.
+ */
+#define __INDIRECTVMINITCALLS__
+#include <stc.h>
+
+#ifdef WIN32
+# pragma codeseg INITCODE "INITCODE"
+#endif
+
+#if defined(INIT_TEXT_SECTION) || defined(DLL_EXPORT)
+DLL_EXPORT void _libstx_goodies_metacello_Init() INIT_TEXT_SECTION;
+DLL_EXPORT void _libstx_goodies_metacello_InitDefinition() INIT_TEXT_SECTION;
+#endif
+
+void _libstx_goodies_metacello_InitDefinition(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello__DFN", _libstx_goodies_metacello_InitDefinition, "stx:goodies/metacello");
+_stx_137goodies_137metacello_Init(pass,__pRT__,snd);
+
+__END_PACKAGE__();
+}
+
+void _libstx_goodies_metacello_Init(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello", _libstx_goodies_metacello_Init, "stx:goodies/metacello");
+_stx_137goodies_137metacello_Init(pass,__pRT__,snd);
+
+
+__END_PACKAGE__();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/metacello.rc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+//
+// DO NOT EDIT
+// automagically generated from the projectDefinition: stx_goodies_metacello.
+//
+VS_VERSION_INFO VERSIONINFO
+  FILEVERSION     6,2,32767,32767
+  PRODUCTVERSION  6,2,4,0
+#if (__BORLANDC__)
+  FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
+  FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
+  FILEOS          VOS_NT_WINDOWS32
+  FILETYPE        VFT_DLL
+  FILESUBTYPE     VS_USER_DEFINED
+#endif
+
+BEGIN
+  BLOCK "StringFileInfo"
+  BEGIN
+    BLOCK "040904E4"
+    BEGIN
+      VALUE "CompanyName", "Dale Henrichs & Jan Vrany\0"
+      VALUE "FileDescription", "Metacello -- a Smalltalk project configuration management tool (LIB)\0"
+      VALUE "FileVersion", "6.2.32767.32767\0"
+      VALUE "InternalName", "stx:goodies/metacello\0"
+      VALUE "LegalCopyright", "Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)\0"
+      VALUE "ProductName", "Metacello\0"
+      VALUE "ProductVersion", "6.2.4.0\0"
+      VALUE "ProductDate", "Thu, 21 Aug 2014 08:17:37 GMT\0"
+    END
+
+  END
+
+  BLOCK "VarFileInfo"
+  BEGIN                               //  Language   |    Translation
+    VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
+  END
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/mingwmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+@REM -------
+@REM make using mingw gnu compiler
+@REM type mingwmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+
+@pushd ..\..\rules
+@call find_mingw.bat
+@popd
+make.exe -N -f bc.mak %DEFINES% %USEMINGW_ARG% %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/Make.proto	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,160 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_stx.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# The Makefile as generated by this Make.proto supports the following targets:
+#    make         - compile all st-files to a classLib
+#    make clean   - clean all temp files
+#    make clobber - clean all
+#
+# This file contains definitions for Unix based platforms.
+# It shares common definitions with the win32-make in Make.spec.
+
+#
+# position (of this package) in directory hierarchy:
+# (must point to ST/X top directory, for tools and includes)
+TOP=../../..
+INCLUDE_TOP=$(TOP)/..
+
+# subdirectories where targets are to be made:
+SUBDIRS=
+
+
+# subdirectories where Makefiles are to be made:
+# (only define if different from SUBDIRS)
+# ALLSUBDIRS=
+
+REQUIRED_SUPPORT_DIRS=
+
+# if your embedded C code requires any system includes,
+# add the path(es) here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALINCLUDES=-Ifoo -Ibar
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/metacello/core -I$(INCLUDE_TOP)/stx/libbasic
+
+
+# if you need any additional defines for embedded C code,
+# add them here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALDEFINES=-Dfoo -Dbar -DDEBUG
+LOCALDEFINES=
+
+LIBNAME=libstx_goodies_metacello_stx
+STCLOCALOPT='-package=$(PACKAGE)' -I. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -headerDir=.  -varPrefix=$(LIBNAME)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C-libraries that should be pre-linked with the class-objects
+LD_OBJ_LIBS=
+LOCAL_SHARED_LIBS=
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C targets or libraries should be added below
+LOCAL_EXTRA_TARGETS=
+
+OBJS= $(COMMON_OBJS) $(UNIX_OBJS)
+
+
+
+all:: preMake classLibRule postMake
+
+pre_objs::  
+
+
+
+
+# Update SVN revision in package definition class
+ifneq (,$(findstring .svn,$(wildcard .svn)))
+.svnversion: *.st
+	if [ -d .svn ]; then \
+		rev=$(shell svnversion -n); \
+		echo -n $$rev > .svnversion; \
+	else \
+		echo -n exported > .svnversion; \
+	fi
+
+stx_goodies_metacello_stx.o: stx_goodies_metacello_stx.st .svnversion
+	@if [ -d .svn ]; then \
+		rev2="$(shell printf "%-16s" $$(cat .svnversion))"; \
+		echo "  [SV]  Expanding svnRevisionNo in $1.st"; \
+		sed -e "s/\"\$$SVN\-Revision:\".*\"\$$\"/\"\$$SVN-Revision:\"\'$$rev2\'\"\$$\"/g" $< > .stx_goodies_metacello_stx.svn.st; \
+	fi
+	$(MAKE) CC="$(CLASSLIB_CC)" OPT="$(OPT)" SEPINITCODE="$(SEPINITCODE)" STC="$(STC)" STFILE=.stx_goodies_metacello_stx.svn $(C_RULE);
+	sed -i -e "s/\".stx_goodies_metacello_stx.svn.st\");/\"\stx_goodies_metacello_stx.st\");/g" .stx_goodies_metacello_stx.svn.c
+	$(MAKE) .stx_goodies_metacello_stx.svn.$(O)
+	@mv .stx_goodies_metacello_stx.svn.$(O) stx_goodies_metacello_stx.$(O)
+endif
+
+
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+ifneq (**NOHG**, $(shell hg root 2> /dev/null || echo -n '**NOHG**'))
+stx_goodies_metacello_stx.$(O): $(shell hg root)/.hg/dirstate
+endif
+
+
+
+
+# run default testsuite for this package
+test: $(TOP)/goodies/builder/reports
+	$(MAKE) -C $(TOP)/goodies/builder/reports -f Makefile.init
+	$(TOP)/goodies/builder/reports/report-runner.sh -D . -r Builder::TestReport -p $(PACKAGE)
+
+
+
+# add more install actions here
+install::
+
+# add more install actions for aux-files (resources) here
+installAux::
+
+# add more preMake actions here
+preMake::
+
+# add more postMake actions here
+postMake:: cleanjunk
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+	cd ../../../libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd ../base && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+	cd ../core && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+
+
+
+# build all packages containing referenced classes for this package
+# they are nor needed to compile the package
+references:
+
+
+cleanjunk::
+	-rm -f *.s *.s2
+
+clean::
+	-rm -f *.o *.H
+
+clobber:: clean
+	-rm -f *.so *.dll
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)MetacelloStXPackageSpec.$(O) MetacelloStXPackageSpec.$(H): MetacelloStXPackageSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXPlatform.$(O) MetacelloStXPlatform.$(H): MetacelloStXPlatform.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloPlatform.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXProject.$(O) MetacelloStXProject.$(H): MetacelloStXProject.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloProject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXRepositoriesSpec.$(O) MetacelloStXRepositoriesSpec.$(H): MetacelloStXRepositoriesSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberListSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXRepositorySpec.$(O) MetacelloStXRepositorySpec.$(H): MetacelloStXRepositorySpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersion.$(O) MetacelloStXVersion.$(H): MetacelloStXVersion.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersion.$(H) $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersionConstructor.$(O) MetacelloStXVersionConstructor.$(H): MetacelloStXVersionConstructor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersionConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersionSpec.$(O) MetacelloStXVersionSpec.$(H): MetacelloStXVersionSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersionSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_stx.$(O) stx_goodies_metacello_stx.$(H): stx_goodies_metacello_stx.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)/stx/libbasic/ArrayedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/Block.$(H) $(INCLUDE_TOP)/stx/libbasic/CharacterArray.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/CompiledCode.$(H) $(INCLUDE_TOP)/stx/libbasic/ExecutableFunction.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/String.$(H) $(INCLUDE_TOP)/stx/libbasic/UninterpretedBytes.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/Make.spec	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,79 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_stx.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# This file contains specifications which are common to all platforms.
+#
+
+# Do NOT CHANGE THESE DEFINITIONS
+# (otherwise, ST/X will have a hard time to find out the packages location from its packageID,
+#  to find the source code of a class and to find the library for a package)
+MODULE=stx
+MODULE_DIR=goodies/metacello/stx
+PACKAGE=$(MODULE):$(MODULE_DIR)
+
+
+# Argument(s) to the stc compiler (stc --usage).
+#  -headerDir=. : create header files locally
+#                (if removed, they will be created as common
+#  -Pxxx       : defines the package
+#  -Zxxx       : a prefix for variables within the classLib
+#  -Dxxx       : defines passed to to CC for inline C-code
+#  -Ixxx       : include path passed to CC for inline C-code
+#  +optspace   : optimized for space
+#  +optspace2  : optimized more for space
+#  +optspace3  : optimized even more for space
+#  +optinline  : generate inline code for some ST constructs
+#  +inlineNew  : additionally inline new
+#  +inlineMath : additionally inline some floatPnt math stuff
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCLOCALOPTIMIZATIONS=+optinline +inlineNew
+# STCLOCALOPTIMIZATIONS=+optspace3
+STCLOCALOPTIMIZATIONS=+optspace3
+
+
+# Argument(s) to the stc compiler (stc --usage).
+#  -warn            : no warnings
+#  -warnNonStandard : no warnings about ST/X extensions
+#  -warnEOLComments : no warnings about EOL comment extension
+#  -warnPrivacy     : no warnings about privateClass extension
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCWARNINGS=-warn
+# STCWARNINGS=-warnNonStandard
+# STCWARNINGS=-warnEOLComments
+STCWARNINGS=-warnNonStandard
+
+COMMON_CLASSES= \
+	MetacelloStXPackageSpec \
+	MetacelloStXPlatform \
+	MetacelloStXProject \
+	MetacelloStXRepositoriesSpec \
+	MetacelloStXRepositorySpec \
+	MetacelloStXVersion \
+	MetacelloStXVersionConstructor \
+	MetacelloStXVersionSpec \
+	stx_goodies_metacello_stx \
+
+
+
+
+COMMON_OBJS= \
+    $(OUTDIR_SLASH)MetacelloStXPackageSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloStXPlatform.$(O) \
+    $(OUTDIR_SLASH)MetacelloStXProject.$(O) \
+    $(OUTDIR_SLASH)MetacelloStXRepositoriesSpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloStXRepositorySpec.$(O) \
+    $(OUTDIR_SLASH)MetacelloStXVersion.$(O) \
+    $(OUTDIR_SLASH)MetacelloStXVersionConstructor.$(O) \
+    $(OUTDIR_SLASH)MetacelloStXVersionSpec.$(O) \
+    $(OUTDIR_SLASH)stx_goodies_metacello_stx.$(O) \
+    $(OUTDIR_SLASH)extensions.$(O) \
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/Makefile.init	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,27 @@
+#
+# DO NOT EDIT
+#
+# make uses this file (Makefile) only, if there is no
+# file named "makefile" (lower-case m) in the same directory.
+# My only task is to generate the real makefile and call make again.
+# Thereafter, I am no longer used and needed.
+#
+# MACOSX caveat:
+#   as filenames are not case sensitive (in a default setup),
+#   we cannot use the above trick. Therefore, this file is now named
+#   "Makefile.init", and you have to execute "make -f Makefile.init" to
+#   get the initial makefile.  This is now also done by the toplevel CONFIG
+#   script.
+
+.PHONY: run
+
+run: makefile
+	$(MAKE) -f makefile
+
+#only needed for the definition of $(TOP)
+include Make.proto
+
+makefile: mf
+
+mf:
+	$(TOP)/rules/stmkmf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXPackageSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,151 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloAbstractPackageSpec subclass:#MetacelloStXPackageSpec
+	instanceVariableNames:'repository preLoadDoIt postLoadDoIt'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-St/X-Specs'
+!
+
+Collection subclass:#Prerequisites
+	instanceVariableNames:'packageSpec suppressions additions'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:MetacelloStXPackageSpec
+!
+
+
+!MetacelloStXPackageSpec methodsFor:'accessing'!
+
+repository
+    ^ repository
+! !
+
+!MetacelloStXPackageSpec methodsFor:'printing & storing'!
+
+configMethodOn: aStream indent: indent
+
+     aStream 
+        tab: indent; nextPutAll: 'spec '; nextPutAll: 'name: ', self name storeString; nextPut: $.; cr.
+
+    "Created: / 03-10-2012 / 00:06:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec methodsFor:'querying'!
+
+requires
+
+    requires == nil ifTrue: [ requires := Prerequisites for: self ].
+    ^requires
+
+    "Created: / 19-09-2012 / 02:35:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec methodsFor:'visiting'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+    packageBlock value: self
+
+    "Created: / 03-10-2012 / 22:58:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec::Prerequisites class methodsFor:'instance creation'!
+
+for: spec
+    ^self new initializeFor: spec
+
+    "Created: / 05-09-2012 / 19:49:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec::Prerequisites methodsFor:'adding & removing'!
+
+add:anObject
+    "add the argument, anObject to the receiver.
+     If the receiver is ordered, the position of the new element is undefined
+     (i.e. don't depend on where it will be put).
+     An error is raised here - it is to be implemented by a concrete subclass."
+
+    ^ self shouldImplement
+!
+
+addFirst:anObject
+    "add the argument, anObject to the receiver.
+     If the receiver is ordered, the new element will be added at the beginning.
+     An error is raised here - it is to be implemented by a concrete subclass."
+
+    ^ self shouldImplement
+!
+
+remove:anObject ifAbsent:exceptionBlock
+    "search for the first element, which is equal to anObject;
+     if found, remove and return it.
+     If not found, return the the value of the exceptionBlock.
+     Uses equality compare (=) to search for the occurrence.
+     An error is raised here - it is to be implemented by a concrete subclass."
+
+    ^ self shouldImplement
+!
+
+removeIdentical:anObject ifAbsent:exceptionBlock
+    "search for the first element, which is identical to anObject;
+     if found, remove and return it.
+     If not found, return the the value of the exceptionBlock.
+     Uses identity compare (==) to search for the occurrence.
+     An error is raised here - it is to be implemented by a concrete subclass."
+
+    ^ self shouldImplement
+!
+
+removeLast
+    "remove the last element from the receiver.
+     Return the removed element.
+     An error is raised here - it is to be implemented by a concrete subclass."
+
+    ^ self shouldImplement
+! !
+
+!MetacelloStXPackageSpec::Prerequisites methodsFor:'enumerating'!
+
+do:aBlock
+    "evaluate the argument, aBlock for each element"
+
+    | def |
+
+    def := ProjectDefinition definitionClassForPackage: packageSpec name.
+    def preRequisites do:[:each|
+        aBlock value: each
+    ]
+
+    "Modified: / 05-09-2012 / 19:53:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+reverseDo:aBlock
+    "evaluate the argument, aBlock for each element in reverse order."
+
+    ^ self do: aBlock
+
+    "Modified: / 05-09-2012 / 19:51:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec::Prerequisites methodsFor:'growing'!
+
+grow:howBig
+    "change the receivers size"
+
+    ^ self shouldImplement
+! !
+
+!MetacelloStXPackageSpec::Prerequisites methodsFor:'initialization'!
+
+initializeFor: aMetacelloStXPackageSpec
+    packageSpec := aMetacelloStXPackageSpec
+
+    "Created: / 05-09-2012 / 19:48:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXPlatform.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloPlatform subclass:#MetacelloStXPlatform
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-St/X-Model'
+!
+
+
+!MetacelloStXPlatform class methodsFor:'initialize-release'!
+
+initialize
+    "
+    MetacelloStXPlatform initialize
+    "
+
+    Current := self new
+
+    "Modified (comment): / 05-09-2012 / 17:41:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPlatform class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
+
+MetacelloStXPlatform initialize!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXProject.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,71 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloProject subclass:#MetacelloStXProject
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-St/X-Model'
+!
+
+
+!MetacelloStXProject class methodsFor:'accessing'!
+
+versionConstructorClass
+    ^ MetacelloStXVersionConstructor
+
+    "Created: / 05-09-2012 / 18:57:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXProject methodsFor:'spec classes'!
+
+packageSpec
+    ^self packageSpecClass for: self
+
+    "Created: / 19-09-2012 / 02:22:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+packageSpecClass
+    ^MetacelloStXPackageSpec
+
+    "Created: / 05-09-2012 / 19:28:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositoriesSpec
+
+        ^self repositoriesSpecClass for: self
+
+    "Created: / 03-10-2012 / 11:05:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositoriesSpecClass
+
+        ^MetacelloStXRepositoriesSpec
+
+    "Created: / 03-10-2012 / 11:05:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositorySpec
+    ^self repositorySpecClass for: self
+
+    "Created: / 03-10-2012 / 10:53:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositorySpecClass
+    ^MetacelloStXRepositorySpec
+
+    "Created: / 03-10-2012 / 10:53:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+versionSpecClass
+
+    ^MetacelloStXVersionSpec
+
+    "Created: / 05-09-2012 / 18:44:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXProject class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXRepositoriesSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,86 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloMemberListSpec subclass:#MetacelloStXRepositoriesSpec
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-St/X-Specs'
+!
+
+
+!MetacelloStXRepositoriesSpec methodsFor:'actions'!
+
+add: aSpec
+
+        aSpec addToMetacelloRepositories: self
+
+    "Modified: / 03-10-2012 / 11:10:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+copy: specNamed to: spec
+
+	self addMember: 
+		(self copyMember 
+			name: spec name;
+			sourceName: specNamed;
+			spec: spec;
+			yourself)
+!
+
+merge: aSpec
+
+        aSpec mergeIntoMetacelloRepositories: self
+
+    "Modified: / 03-10-2012 / 11:10:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+remove: aSpec
+
+        aSpec removeFromMetacelloRepositories: self
+
+    "Modified: / 03-10-2012 / 11:10:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositoriesSpec methodsFor:'printing'!
+
+configMethodOn: aStream indent: indent
+
+        | repoSpecs |
+        repoSpecs := self map values.
+        repoSpecs isEmptyOrNil ifTrue: [ ^aStream nextPutAll: 'spec add: []' ].
+        repoSpecs size = 1
+                ifTrue: [
+                        aStream 
+                                tab: indent; 
+                                nextPutAll: 'spec add: ['; cr.
+                        repoSpecs first configMethodOn: aStream indent: indent + 1.
+                        aStream nextPut: $]; cr ]
+                ifFalse: [
+                        aStream 
+                                tab: indent; 
+                                nextPutAll: 'spec'.
+                        1 to: repoSpecs size do: [:index | | packageSpec |
+                                packageSpec := repoSpecs at: index.
+                                aStream 
+                                        tab: indent + 1;
+                                        nextPutAll: 'add: ['; cr.
+                                packageSpec configMethodOn: aStream indent: indent + 2.
+                                aStream nextPut: $].
+                                index < repoSpecs size
+                                        ifTrue: [ aStream nextPut: $; ].
+                                aStream cr ]]
+
+    "Modified: / 03-10-2012 / 11:19:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositoriesSpec class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXRepositorySpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,153 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloSpec subclass:#MetacelloStXRepositorySpec
+	instanceVariableNames:'name type url username password keyfile'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-St/X-Specs'
+!
+
+
+!MetacelloStXRepositorySpec methodsFor:'accessing'!
+
+name
+    ^ name
+!
+
+name:aString
+    name := aString.
+!
+
+type
+    ^ type
+!
+
+type: anObject
+    anObject setTypeInMetacelloStXRepository: self
+
+    "Modified: / 03-10-2012 / 11:42:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+url
+    ^ url
+
+    "Created: / 03-10-2012 / 12:47:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+url: anObject
+    anObject setUrlInMetacelloStXRepository: self
+
+    "Created: / 03-10-2012 / 11:42:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec methodsFor:'accessing-private'!
+
+getType
+    ^ type
+
+    "Created: / 03-10-2012 / 11:40:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+getUrl
+    ^ url
+
+    "Created: / 03-10-2012 / 11:40:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setType: anObject
+    type := anObject
+
+    "Created: / 03-10-2012 / 11:41:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setUrl: anObject
+    url := anObject
+
+    "Created: / 03-10-2012 / 11:41:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec methodsFor:'checkout'!
+
+checkout: packageId
+    self halt.
+
+    "Created: / 20-08-2014 / 10:46:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec methodsFor:'construction'!
+
+type: aBlockOrString constructor: aVersionConstructor
+     aVersionConstructor typeForVersion: aBlockOrString
+
+    "Created: / 03-10-2012 / 11:34:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+url: aBlockOrString constructor: aVersionConstructor
+     aVersionConstructor urlForVersion: aBlockOrString
+
+    "Created: / 03-10-2012 / 11:35:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec methodsFor:'merging'!
+
+mergeIntoMetacelloRepositories: aMetacelloRepositoriesSpec
+
+    aMetacelloRepositoriesSpec addMember: 
+        (aMetacelloRepositoriesSpec mergeMember 
+            name: self name;
+            spec: self;
+            yourself)
+
+    "Created: / 03-10-2012 / 11:11:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+mergeMap
+    ^ super mergeMap
+        at: #type put: type;       
+        at: #url put: url;
+        yourself.
+
+    "Created: / 20-08-2014 / 11:16:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+mergeSpec: specToMergeIn
+    | mergedSpec mergeMap |
+
+    mergedSpec := super mergeSpec: specToMergeIn.
+    mergeMap := self mergeMap.  
+    "/ Put special rules here.
+    ^ mergedSpec.
+
+    "Created: / 20-08-2014 / 11:18:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec methodsFor:'printing'!
+
+configMethodOn:aStream indent:indent
+
+    aStream 
+        tab: indent; nextPutAll: 'spec '; nextPutAll: 'name: ', self name storeString.
+
+    (type ? url) notNil ifTrue:[
+        aStream 
+            nextPutAll: ' with: [' ; cr.
+            type notNil ifTrue:[
+                aStream tab: indent + 1; nextPutAll: 'spec type: '; nextPutAll: self type value storeString; nextPut:$.; cr.
+            ].
+            url notNil ifTrue:[
+                aStream tab: indent + 1; nextPutAll: 'spec url: '; nextPutAll: self url value storeString; nextPut:$.; cr.
+            ].
+            aStream tab: indent; nextPutAll: '].' ; cr.
+    ] ifFalse:[
+        aStream nextPut: $. ; cr.
+    ]
+
+    "Modified: / 03-10-2012 / 12:48:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXVersion.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,29 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloVersion subclass:#MetacelloStXVersion
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-St/X-Model'
+!
+
+
+!MetacelloStXVersion methodsFor:'accessing'!
+
+packages
+    "Answers the list of packages associated with this version"
+
+    | packages |
+    packages := OrderedCollection new.
+    self spec projectDo: [:ignored | ] packageDo: [:pkg | packages add: pkg ] groupDo: [:ignored | ].
+    ^packages
+
+    "Created: / 03-10-2012 / 22:50:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersion class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXVersionConstructor.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,132 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloVersionConstructor subclass:#MetacelloStXVersionConstructor
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-St/X-Constructors'
+!
+
+
+!MetacelloStXVersionConstructor methodsFor:'api'!
+
+repositories: aBlock
+    self shouldNotImplement. "/use multiple repository:/repository:with:
+
+    "Created: / 03-10-2012 / 10:43:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repository: description username: username password: password
+    self shouldNotImplement. "/ use repository:with:
+"/    self root
+"/        repository: description
+"/        username: username
+"/        password: password
+"/        constructor: self
+
+    "Created: / 03-10-2012 / 10:44:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repository: anObject with: aBlock
+    self root repository: anObject with: aBlock constructor: self
+
+    "Created: / 03-10-2012 / 10:45:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+type: anObject
+    "Defines repository type (for MetacelloStXRepositorySpec).
+     Type must be one of #cvs, #svn or #git."
+
+    self root type: anObject constructor: self
+
+    "Created: / 03-10-2012 / 11:26:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+url: anObject
+    "Defines repository type (for MetacelloStXRepositorySpec).
+     Url may contain %(VAR) style variables that are expanded
+     before URL is used. See MetacelloStXRepositorySpec>>documentation
+     for details"
+
+    self root url: anObject constructor: self
+
+    "Created: / 03-10-2012 / 11:27:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionConstructor methodsFor:'api callbacks'!
+
+setRepository: aString withBlock: aBlock
+
+        | spec |
+        spec := 
+                (self project repositorySpec)
+                        name: aString;
+                        yourself.
+        self root repositories merge: spec.
+        self with: spec during: aBlock
+
+    "Created: / 03-10-2012 / 10:52:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setTypeWithBlock: aBlock
+
+        | spec |
+        (spec := self root getType) == nil
+                ifTrue: [ 
+                        spec := self project valueHolderSpec.
+                        self root setType: spec ].
+        self with: spec during: aBlock
+
+    "Created: / 03-10-2012 / 11:38:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setTypeWithString: aString
+    self root type: aString
+
+    "Created: / 03-10-2012 / 11:38:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setUrlWithBlock: aBlock
+
+        | spec |
+        (spec := self root getUrl) == nil
+                ifTrue: [ 
+                        spec := self project valueHolderSpec.
+                        self root setUrl: spec ].
+        self with: spec during: aBlock
+
+    "Created: / 03-10-2012 / 11:39:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setUrlWithString: aString
+    self root url: aString
+
+    "Created: / 03-10-2012 / 11:38:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionConstructor methodsFor:'api spec callbacks'!
+
+repositoryForVersion: packageName with: aBlockOrString
+    aBlockOrString setRepository: packageName withInMetacelloConfig: self
+
+    "Created: / 03-10-2012 / 10:47:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+typeForVersion: aBlockOrString
+    aBlockOrString setTypeInMetacelloConfig: self
+
+    "Created: / 03-10-2012 / 11:35:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+urlForVersion: aBlockOrString
+    aBlockOrString setUrlInMetacelloConfig: self
+
+    "Created: / 03-10-2012 / 11:35:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionConstructor class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXVersionSpec.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,126 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloVersionSpec subclass:#MetacelloStXVersionSpec
+	instanceVariableNames:'packages repositories'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Metacello-St/X-Specs'
+!
+
+
+!MetacelloStXVersionSpec methodsFor:'accessing'!
+
+computeVersionStatus: matchBlock
+    ^#noStatus
+    "/self computeVersionStatus: (self expandToLoadableSpecNames: #('ALL')) matchBlock: matchBlock
+
+    "Created: / 19-09-2012 / 02:27:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+packageSpecsInLoadOrder
+    ^ self packages packageSpecsInLoadOrder
+
+    "Created: / 19-09-2012 / 02:32:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+packages
+    packages isNil ifTrue: [ packages := self project packagesSpec ].
+    ^ packages
+
+    "Created: / 19-09-2012 / 02:24:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+packages: anObject
+    packages := anObject
+
+    "Created: / 19-09-2012 / 02:24:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositories
+    repositories isNil ifTrue: [ repositories := self project repositoriesSpec ].
+    ^ repositories
+
+    "Created: / 03-10-2012 / 11:04:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositories: anObject
+    repositories := anObject
+
+    "Created: / 03-10-2012 / 11:04:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionSpec methodsFor:'checkout'!
+
+checkout
+    self packageSpecsInLoadOrder do:[:pkgSpec |
+        | repo |
+        repo := pkgSpec repository.
+        repo isNil ifTrue:[ 
+            | repos |
+
+            repos := OrderedCollection new.     
+            self repositories map valuesDo: [ :e | repos add: e ]. 
+            repos size ~~ 1 ifTrue:[ 
+                self error:'Ambiguous repository spec for package ...'.
+            ].
+            repo := repos anElement.
+        ].
+        repo checkout: pkgSpec.
+    ].
+
+    "Created: / 20-08-2014 / 10:57:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionSpec methodsFor:'construction'!
+
+package: aString constructor: aVersionConstructor
+    aVersionConstructor packageForVersion: aString
+
+    "Created: / 19-09-2012 / 02:20:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+package: aString overrides: aBlock constructor: aVersionConstructor
+    aVersionConstructor packageForVersion: aString overrides: aBlock
+
+    "Created: / 19-09-2012 / 02:20:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+package: packageName with: aBlockOrString constructor: aVersionConstructor
+    aVersionConstructor packageForVersion: packageName with: aBlockOrString
+
+    "Created: / 19-09-2012 / 02:20:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repository: repositoryName with: aBlockOrString constructor: aVersionConstructor
+    aVersionConstructor repositoryForVersion: repositoryName with: aBlockOrString
+
+    "Created: / 03-10-2012 / 10:49:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionSpec methodsFor:'enumerating'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+    self packageSpecsInLoadOrder do:  [:pkgSpec |
+        pkgSpec 
+            projectDo: projectBlock 
+            packageDo: packageBlock 
+              groupDo: groupBlock 
+    ]
+
+    "Created: / 03-10-2012 / 22:53:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionSpec methodsFor:'private'!
+
+versionClass
+    ^MetacelloStXVersion
+
+    "Created: / 03-10-2012 / 22:49:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionSpec class methodsFor:'documentation'!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/abbrev.stc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,12 @@
+# automagically generated by the project definition
+# this file is needed for stc to be able to compile modules independently.
+# it provides information about a classes filename, category and especially namespace.
+MetacelloStXPlatform MetacelloStXPlatform stx:goodies/metacello/stx 'Metacello-St/X-Model' 0
+MetacelloStXProject MetacelloStXProject stx:goodies/metacello/stx 'Metacello-St/X-Model' 0
+stx_goodies_metacello_stx stx_goodies_metacello_stx stx:goodies/metacello/stx '* Projects & Packages *' 3
+MetacelloStXPackageSpec MetacelloStXPackageSpec stx:goodies/metacello/stx 'Metacello-St/X-Specs' 0
+MetacelloStXVersionConstructor MetacelloStXVersionConstructor stx:goodies/metacello/stx 'Metacello-St/X-Constructors' 0
+MetacelloStXVersionSpec MetacelloStXVersionSpec stx:goodies/metacello/stx 'Metacello-St/X-Specs' 0
+MetacelloStXRepositoriesSpec MetacelloStXRepositoriesSpec stx:goodies/metacello/stx 'Metacello-St/X-Specs' 0
+MetacelloStXRepositorySpec MetacelloStXRepositorySpec stx:goodies/metacello/stx 'Metacello-St/X-Specs' 0
+MetacelloStXVersion MetacelloStXVersion stx:goodies/metacello/stx 'Metacello-St/X-Model' 0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/bc.mak	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,92 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_stx.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# Notice, that the name bc.mak is historical (from times, when only borland c was supported).
+# This file contains make rules for the win32 platform using either borland-bcc or visual-c.
+# It shares common definitions with the unix-make in Make.spec.
+# The bc.mak supports the following targets:
+#    bmake         - compile all st-files to a classLib (dll)
+#    bmake clean   - clean all temp files
+#    bmake clobber - clean all
+#
+# Historic Note:
+#  this used to contain only rules to make with borland
+#    (called via bmake, by "make.exe -f bc.mak")
+#  this has changed; it is now also possible to build using microsoft visual c
+#    (called via vcmake, by "make.exe -f bc.mak -DUSEVC")
+#
+TOP=..\..\..
+INCLUDE_TOP=$(TOP)\..
+
+
+
+!INCLUDE $(TOP)\rules\stdHeader_bc
+
+!INCLUDE Make.spec
+
+LIBNAME=libstx_goodies_metacello_stx
+RESFILES=stx.$(RES)
+
+
+
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\metacello\core -I$(INCLUDE_TOP)\stx\libbasic
+LOCALDEFINES=
+
+STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
+LOCALLIBS=
+
+OBJS= $(COMMON_OBJS) $(WIN32_OBJS)
+
+ALL::  classLibRule
+
+classLibRule: $(OUTDIR) $(OUTDIR)$(LIBNAME).dll
+
+!INCLUDE $(TOP)\rules\stdRules_bc
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+	pushd ..\..\..\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\base & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+	pushd ..\core & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+
+
+
+
+
+
+
+test: $(TOP)\goodies\builder\reports\NUL
+	pushd $(TOP)\goodies\builder\reports & $(MAKE_BAT)
+	$(TOP)\goodies\builder\reports\report-runner.bat -D . -r Builder::TestReport -p $(PACKAGE)
+        
+clean::
+	del *.$(CSUFFIX)
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)MetacelloStXPackageSpec.$(O) MetacelloStXPackageSpec.$(H): MetacelloStXPackageSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXPlatform.$(O) MetacelloStXPlatform.$(H): MetacelloStXPlatform.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloPlatform.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXProject.$(O) MetacelloStXProject.$(H): MetacelloStXProject.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloProject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXRepositoriesSpec.$(O) MetacelloStXRepositoriesSpec.$(H): MetacelloStXRepositoriesSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberListSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXRepositorySpec.$(O) MetacelloStXRepositorySpec.$(H): MetacelloStXRepositorySpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersion.$(O) MetacelloStXVersion.$(H): MetacelloStXVersion.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersion.$(H) $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersionConstructor.$(O) MetacelloStXVersionConstructor.$(H): MetacelloStXVersionConstructor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersionConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersionSpec.$(O) MetacelloStXVersionSpec.$(H): MetacelloStXVersionSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersionSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_stx.$(O) stx_goodies_metacello_stx.$(H): stx_goodies_metacello_stx.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)\stx\libbasic\ArrayedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\Block.$(H) $(INCLUDE_TOP)\stx\libbasic\CharacterArray.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\CompiledCode.$(H) $(INCLUDE_TOP)\stx\libbasic\ExecutableFunction.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\String.$(H) $(INCLUDE_TOP)\stx\libbasic\UninterpretedBytes.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
+# **Must be at end**
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+!IFDEF HGROOT
+$(OUTDIR)stx_goodies_metacello_stx.$(O): $(HGROOT)\.hg\dirstate
+!ENDIF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/bmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,12 @@
+@REM -------
+@REM make using Borland bcc32
+@REM type bmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak  %DEFINES% %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/extensions.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,77 @@
+"{ Package: 'stx:goodies/metacello/stx' }"!
+
+!Block methodsFor:'*metacello-stx'!
+
+setRepository: aString withInMetacelloConfig: aMetacelloConfig
+
+        aMetacelloConfig setRepository: aString withBlock: self
+
+    "Created: / 03-10-2012 / 10:51:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setTypeInMetacelloConfig: aMetacelloConfig
+
+    aMetacelloConfig setTypeWithBlock: self
+
+    "Created: / 03-10-2012 / 11:37:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setUrlInMetacelloConfig: aMetacelloConfig
+
+        aMetacelloConfig setUrlWithBlock: self
+
+    "Created: / 03-10-2012 / 11:37:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setTypeInMetacelloConfig: aMetacelloConfig
+
+    aMetacelloConfig setTypeWithString: self
+
+    "Created: / 03-10-2012 / 11:36:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setTypeInMetacelloStXRepository: aMetacelloStXRepository
+
+    aMetacelloStXRepository setType: 
+                (aMetacelloStXRepository project valueHolderSpec
+                        value: self;
+                        yourself)
+
+    "Created: / 03-10-2012 / 11:44:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setUrlInMetacelloConfig: aMetacelloConfig
+
+    aMetacelloConfig setUrlWithString: self
+
+    "Created: / 03-10-2012 / 11:36:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setUrlInMetacelloStXRepository: aMetacelloStXRepository
+
+    aMetacelloStXRepository setUrl: 
+                (aMetacelloStXRepository project valueHolderSpec
+                        value: self;
+                        yourself)
+
+    "Created: / 03-10-2012 / 11:44:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello_stx class methodsFor:'documentation'!
+
+extensionsVersion_HG
+
+    ^ '$Changeset: <not expanded> $'
+! !
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/lccmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,8 @@
+@REM -------
+@REM make using lcc compiler
+@REM type lccmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+make.exe -N -f bc.mak -DUSELCC=1 %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/libInit.cc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,42 @@
+/*
+ * $Header$
+ *
+ * DO NOT EDIT
+ * automagically generated from the projectDefinition: stx_goodies_metacello_stx.
+ */
+#define __INDIRECTVMINITCALLS__
+#include <stc.h>
+
+#ifdef WIN32
+# pragma codeseg INITCODE "INITCODE"
+#endif
+
+#if defined(INIT_TEXT_SECTION) || defined(DLL_EXPORT)
+DLL_EXPORT void _libstx_goodies_metacello_stx_Init() INIT_TEXT_SECTION;
+DLL_EXPORT void _libstx_goodies_metacello_stx_InitDefinition() INIT_TEXT_SECTION;
+#endif
+
+void _libstx_goodies_metacello_stx_InitDefinition(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_stx__DFN", _libstx_goodies_metacello_stx_InitDefinition, "stx:goodies/metacello/stx");
+_stx_137goodies_137metacello_137stx_Init(pass,__pRT__,snd);
+
+__END_PACKAGE__();
+}
+
+void _libstx_goodies_metacello_stx_Init(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_stx", _libstx_goodies_metacello_stx_Init, "stx:goodies/metacello/stx");
+_MetacelloStXPackageSpec_Init(pass,__pRT__,snd);
+_MetacelloStXPlatform_Init(pass,__pRT__,snd);
+_MetacelloStXProject_Init(pass,__pRT__,snd);
+_MetacelloStXRepositoriesSpec_Init(pass,__pRT__,snd);
+_MetacelloStXRepositorySpec_Init(pass,__pRT__,snd);
+_MetacelloStXVersion_Init(pass,__pRT__,snd);
+_MetacelloStXVersionConstructor_Init(pass,__pRT__,snd);
+_MetacelloStXVersionSpec_Init(pass,__pRT__,snd);
+_stx_137goodies_137metacello_137stx_Init(pass,__pRT__,snd);
+
+_stx_137goodies_137metacello_137stx_extensions_Init(pass,__pRT__,snd);
+__END_PACKAGE__();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/mingwmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+@REM -------
+@REM make using mingw gnu compiler
+@REM type mingwmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+
+@pushd ..\..\..\rules
+@call find_mingw.bat
+@popd
+make.exe -N -f bc.mak %DEFINES% %USEMINGW_ARG% %*
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/stx.rc	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+//
+// DO NOT EDIT
+// automagically generated from the projectDefinition: stx_goodies_metacello_stx.
+//
+VS_VERSION_INFO VERSIONINFO
+  FILEVERSION     6,2,32767,32767
+  PRODUCTVERSION  6,2,4,0
+#if (__BORLANDC__)
+  FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
+  FILEFLAGS       VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
+  FILEOS          VOS_NT_WINDOWS32
+  FILETYPE        VFT_DLL
+  FILESUBTYPE     VS_USER_DEFINED
+#endif
+
+BEGIN
+  BLOCK "StringFileInfo"
+  BEGIN
+    BLOCK "040904E4"
+    BEGIN
+      VALUE "CompanyName", "Dale Henrichs & Jan Vrany\0"
+      VALUE "FileDescription", "Metacello -- a Smalltalk project configuration management tool (LIB)\0"
+      VALUE "FileVersion", "6.2.32767.32767\0"
+      VALUE "InternalName", "stx:goodies/metacello/stx\0"
+      VALUE "LegalCopyright", "Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)\0"
+      VALUE "ProductName", "Metacello\0"
+      VALUE "ProductVersion", "6.2.4.0\0"
+      VALUE "ProductDate", "Thu, 21 Aug 2014 08:17:49 GMT\0"
+    END
+
+  END
+
+  BLOCK "VarFileInfo"
+  BEGIN                               //  Language   |    Translation
+    VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
+  END
+END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/stx_goodies_metacello_stx.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,148 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+LibraryDefinition subclass:#stx_goodies_metacello_stx
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'* Projects & Packages *'
+!
+
+
+!stx_goodies_metacello_stx class methodsFor:'description'!
+
+excludedFromPreRequisites
+    "list all packages which should be ignored in the automatic
+     preRequisites scan. See #preRequisites for more."
+
+    ^ #(
+    )
+!
+
+preRequisites
+    "list all required packages.
+     This list can be maintained manually or (better) generated and
+     updated by scanning the superclass hierarchies and looking for
+     global variable accesses. (the browser has a menu function for that)
+     Howevery, often too much is found, and you may want to explicitely
+     exclude individual packages in the #excludedFromPrerequisites method."
+
+    ^ #(
+        #'stx:goodies/metacello/core'    "MetacelloSpec - superclass of MetacelloStXRepositoriesSpec "
+        #'stx:libbasic'    "SequenceableCollection - superclass of extended UninterpretedBytes "
+    )
+! !
+
+!stx_goodies_metacello_stx class methodsFor:'description - contents'!
+
+classNamesAndAttributes
+    "lists the classes which are to be included in the project.
+     Each entry in the list may be: a single class-name (symbol),
+     or an array-literal consisting of class name and attributes.
+     Attributes are: #autoload or #<os> where os is one of win32, unix,..."
+
+    ^ #(
+        "<className> or (<className> attributes...) in load order"
+        MetacelloStXPlatform
+        MetacelloStXProject
+        #'stx_goodies_metacello_stx'
+        MetacelloStXPackageSpec
+        MetacelloStXVersionConstructor
+        MetacelloStXVersionSpec
+        MetacelloStXRepositoriesSpec
+        MetacelloStXRepositorySpec
+        MetacelloStXVersion
+    )
+!
+
+extensionMethodNames
+    "lists the extension methods which are to be included in the project.
+     Entries are 2-element array literals, consisting of class-name and selector."
+
+    ^ #(
+        Block setRepository:withInMetacelloConfig:
+        Block setTypeInMetacelloConfig:
+        Block setUrlInMetacelloConfig:
+        String setTypeInMetacelloConfig:
+        String setTypeInMetacelloStXRepository:
+        String setUrlInMetacelloConfig:
+        String setUrlInMetacelloStXRepository:
+    )
+! !
+
+!stx_goodies_metacello_stx class methodsFor:'description - project information'!
+
+applicationIconFileName
+    "Return the name (without suffix) of an icon-file (the app's icon); will be included in the rc-resource file"
+
+    ^ nil
+    "/ ^ self applicationName
+!
+
+companyName
+    "Return a companyname which will appear in <lib>.rc"
+
+    ^ 'Dale Henrichs & Jan Vrany'
+
+    "Modified: / 10-09-2012 / 22:14:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+description
+    "Return a description string which will appear in vc.def / bc.def"
+
+    ^ 'Metacello -- a Smalltalk project configuration management tool'
+
+    "Modified: / 10-09-2012 / 22:15:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+legalCopyright
+    "Return a copyright string which will appear in <lib>.rc"
+
+    ^ 'Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)'
+
+    "Modified: / 10-09-2012 / 22:16:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+productInstallDirBaseName
+    "Returns a default installDir which will appear in <app>.nsi.
+     This is usually not the one you want to keep"
+
+    ^ (self package asCollectionOfSubstringsSeparatedByAny:':/') last
+!
+
+productName
+    "Return a product name which will appear in <lib>.rc"
+
+    ^ 'Metacello'
+
+    "Modified: / 10-09-2012 / 22:16:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello_stx class methodsFor:'description - svn'!
+
+svnRepositoryUrlString
+    "Return a SVN repository URL of myself.
+     (Generated since 2011-04-08)
+     Do not make the string shorter!!!!!! We have to use fixed-length keyword!!!!!!
+    "        
+
+    ^ '$URL::                                                                                                                        $'
+!
+
+svnRevisionNr
+    "Return a SVN revision number of myself.
+     This number is updated after a commit"
+
+    ^ "$SVN-Revision:"'22              '"$"
+! !
+
+!stx_goodies_metacello_stx class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/vcmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,20 @@
+@REM -------
+@REM make using Microsoft Visual C compiler
+@REM type vcmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+
+@if not defined VSINSTALLDIR (
+    pushd ..\..\..\rules
+    call vcsetup.bat
+    popd
+)
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak -DUSEVC=1 %DEFINES% %*
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx_goodies_metacello.st	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,135 @@
+"{ Package: 'stx:goodies/metacello' }"
+
+LibraryDefinition subclass:#stx_goodies_metacello
+	instanceVariableNames:''
+	classVariableNames:''
+	poolDictionaries:''
+	category:'* Projects & Packages *'
+!
+
+
+!stx_goodies_metacello class methodsFor:'description'!
+
+excludedFromPreRequisites
+    "list all packages which should be ignored in the automatic
+     preRequisites scan. See #preRequisites for more."
+
+    ^ #(
+    )
+!
+
+preRequisites
+    "list all required packages.
+     This list can be maintained manually or (better) generated and
+     updated by scanning the superclass hierarchies and looking for
+     global variable accesses. (the browser has a menu function for that)
+     Howevery, often too much is found, and you may want to explicitely
+     exclude individual packages in the #excludedFromPrerequisites method."
+
+    ^ #(
+        #'stx:goodies/metacello/base'
+        #'stx:goodies/metacello/core'
+        #'stx:goodies/metacello/stx'
+        #'stx:libbasic'    "ProjectDefinition - superclass of stx_goodies_metacello "
+    )
+! !
+
+!stx_goodies_metacello class methodsFor:'description - contents'!
+
+classNamesAndAttributes
+    "lists the classes which are to be included in the project.
+     Each entry in the list may be: a single class-name (symbol),
+     or an array-literal consisting of class name and attributes.
+     Attributes are: #autoload or #<os> where os is one of win32, unix,..."
+
+    ^ #(
+        "<className> or (<className> attributes...) in load order"
+        #'stx_goodies_metacello'
+    )
+!
+
+extensionMethodNames
+    "lists the extension methods which are to be included in the project.
+     Entries are 2-element array literals, consisting of class-name and selector."
+
+    ^ #(
+    )
+! !
+
+!stx_goodies_metacello class methodsFor:'description - project information'!
+
+applicationIconFileName
+    "Return the name (without suffix) of an icon-file (the app's icon); will be included in the rc-resource file"
+
+    ^ nil
+    "/ ^ self applicationName
+!
+
+companyName
+    "Return a companyname which will appear in <lib>.rc"
+
+    ^ 'Dale Henrichs & Jan Vrany'
+
+    "Modified: / 10-09-2012 / 22:14:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+description
+    "Return a description string which will appear in vc.def / bc.def"
+
+    ^ 'Metacello -- a Smalltalk project configuration management tool'
+
+    "Modified: / 10-09-2012 / 22:15:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+legalCopyright
+    "Return a copyright string which will appear in <lib>.rc"
+
+    ^ 'Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)'
+
+    "Modified: / 10-09-2012 / 22:16:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+productInstallDirBaseName
+    "Returns a default installDir which will appear in <app>.nsi.
+     This is usually not the one you want to keep"
+
+    ^ (self package asCollectionOfSubstringsSeparatedByAny:':/') last
+!
+
+productName
+    "Return a product name which will appear in <lib>.rc"
+
+    ^ 'Metacello'
+
+    "Modified: / 10-09-2012 / 22:16:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello class methodsFor:'description - svn'!
+
+svnRepositoryUrlString
+    "Return a SVN repository URL of myself.
+     (Generated since 2011-04-08)
+     Do not make the string shorter!!!!!! We have to use fixed-length keyword!!!!!!
+    "        
+
+    ^ '$URL::                                                                                                                        $'
+!
+
+svnRevisionNr
+    "Return a SVN revision number of myself.
+     This number is updated after a commit"
+
+    ^ "$SVN-Revision:"'6               '"$"
+! !
+
+!stx_goodies_metacello class methodsFor:'documentation'!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+    ^ '$Id::                                                                                                                        $'
+! !
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/vcmake.bat	Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,20 @@
+@REM -------
+@REM make using Microsoft Visual C compiler
+@REM type vcmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+
+@if not defined VSINSTALLDIR (
+    pushd ..\..\rules
+    call vcsetup.bat
+    popd
+)
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak -DUSEVC=1 %DEFINES% %*
+
+
+
+