public void execute() throws Exception {
		if (getBefore() == null || getBefore().invoke(getContext(), this)) {
			
			getContext().getStack().push(this);
			
			int count = calcCount();
			
			for (int i=0; i<count; i++) {
				makeValues(i);
				
				if (getBeforeSave() == null || getBeforeSave().invoke(getContext(), this, getValues())) {
					
					if (keyRegister()) {
						persist();
						
						executeSubElements();
						
						if (getAfterSave() != null) { 
							getAfterSave().invoke(getContext(), this, getValues());
						}
					} else {
						log.info("DUPLICATION: Make an another turn");
						
						count++; // Make an another turn.
					}
				}
			}
			
			getContext().getStack().pop();
			
			if (getAfter() != null) {
				getAfter().invoke(getContext(), this);
			}
		}
	}