<?xml version="1.0"?>
<!--

  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

-->
<ruleset name="Binding Rules"
         xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd"
         xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd">

	<description>
      The Binding ruleset contains a collection of good practices around usage of binding.
	</description>

	<rule class="org.apache.flex.pmd.rules.binding.BindingUtilsRule"
		message="BindingUtils class uses hard coded strings, which won't be picked up by the compiler if you rename this attribute. You should probably consider refactoring using events">
		<description></description>
		<priority>1</priority>
		<example>
public class Controller extends FrontController
{
   public function Controller()
   {
   	 BindingUtils.bindSetter(setContent, value, "content"); // VIOLATION
   }
}	 
      	 </example>
	</rule>

	<rule class="org.apache.flex.pmd.rules.binding.ChangeWatcherRule"
		message="ChangeWatcher class uses hard coded strings to specify the attribute name, to listen to. Prefer listening to events or setters">
		<priority>1</priority>
		<example>
public final class Title 
{
	private var watcher : ChangeWatcher; // VIOLATION
}		
		</example>
	</rule>

	<rule class="org.apache.flex.pmd.rules.binding.TooLongBindingExpressionRule"
		message="This binding expression is too long ({0} dots maximum, but {1} actually)">
		<description>A Binding expression is executed as soon as one of the bindable attributes changed. If a binding expression contains too many expression, there could be some performance issue.</description>
		<priority>3</priority>
		<properties>
			<property name="maximum">
				<value>3</value>
			</property>
		</properties>
		<example>
		<![CDATA[
<mx:Label text="{ vfrfr.frfr.frf.lala }"/> <!-- Violation-->
		]]>
		</example>
	</rule>
</ruleset>
